我现在一个大概有10万条的单表中执行下面的查询语句,时间大概要17秒.SELECT COUNT( id) FROM cass WHERE almc LIKE '%合同%';id 是主键,自增长的. 我想请问大家这是什么原因.我用的mysql版本是5.0.27 我在SQL Server中执行同样的语句不到一秒.
谢谢.
-----------------------------------------------------------
cass表的结构是:
CREATE TABLE `cass` (
  `id` int(11) NOT NULL auto_increment,
  `almc` varchar(255) character set latin1 collate latin1_bin default NULL,
  `wslb` varchar(64) character set latin1 collate latin1_bin default NULL,
  `spcx` varchar(10) character set latin1 collate latin1_bin default NULL,
  `cpwh` varchar(34) character set latin1 collate latin1_bin default NULL,
  `cpsj` varchar(10) character set latin1 collate latin1_bin default NULL,
  `slfy` varchar(64) character set latin1 collate latin1_bin default NULL,
  `ajlb` varchar(64) character set latin1 collate latin1_bin default NULL,
  `gjz` varchar(200) character set latin1 collate latin1_bin default NULL,
  `TP_ID` int(11) default NULL,
  `alnr` longtext,
  `tp_lbmc` char(1) character set latin1 collate latin1_bin default NULL,
  `oldlevel1` varchar(20) default NULL,
  `oldlevel2` varchar(20) default NULL,
  `oldlevel3` varchar(20) default NULL,
  `bl1` int(11) default NULL,
  `bl2` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `indx_spcx` (`spcx`),
  KEY `indx_mc` (`almc`),
  KEY `indx_cpwh` (`cpwh`),
  KEY `indx_wslb` (`wslb`),
  KEY `indx_oldlevel1` (`oldlevel1`),
  KEY `indx_oldlevel2` (`oldlevel2`),
  KEY `indx_oldlevel3` (`oldlevel3`)
) ENGINE=MyISAM AUTO_INCREMENT=106699;

解决方案 »

  1.   

    用LIKE当然就慢了。
    你的是windows版本?
      

  2.   

    是的windows.但在查询的时候必须要模糊查询的.
      

  3.   

    like %XX%
    不能使用索引,自然会慢。
      

  4.   

    看看这篇文章:
    http://bbs.bjp.org.cn/html/modules/newbb/viewtopic.php?post_id=52162
      

  5.   

    那我这时必须要使用like,该怎么处理呢.
    Mysql有没有可以优化的地方.
    谢谢
      

  6.   

    sqlserver真地那么牛吗?我不大相信。
      

  7.   

    千万不要使用%like%, 这是种遍历,没用到索引,可参考http://blog.csdn.net/wqf363/archive/2006/11/12/1380407.aspx
      

  8.   

    mysql使用like %abc的形式,不能使用索引,当然会慢。我想其它数据库也是这样的。
    你现在要改变的是表结构,一个好的表结构可以避免这种查询。
    当然你也可以使用sqlserver.不过我认为你在那个数据库上的快速是因为第一次查询后,第二次查询使用了缓存的结果。你可以再试几次。
      

  9.   

    若要全文搜索快,肯定要用到FULLTEXT indexes, 否则很慢。
    我想MSSQL若会快,肯定用到FULLTEXT的技术