日期:2014-05-16  浏览次数:20721 次

求教mysql查询超慢
SQL code
CREATE TABLE IF NOT EXISTS `ceshi` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `link` varchar(255) DEFAULT NULL COMMENT '源文地址',
  `title` varchar(255) DEFAULT NULL COMMENT '标题',
  `description` text,
  `create_time` varchar(255) DEFAULT NULL COMMENT '发布时间',
  `addtime` varchar(255) DEFAULT NULL COMMENT '收录时间',
  `source` varchar(255) DEFAULT NULL COMMENT '来源',
  `keyword` varchar(255) DEFAULT NULL COMMENT '关键字',
  `tonality` varchar(255) DEFAULT NULL,
  `focus` varchar(255) DEFAULT NULL,
  `brand` varchar(255) DEFAULT NULL,
  `item_id` int(10) NOT NULL DEFAULT '2',
  `create_user` varchar(100) NOT NULL,
  `pub_time` varchar(100) NOT NULL,
  `modify_time` varchar(100) NOT NULL,
  `media` varchar(100) NOT NULL,
  `is_deal` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `title` (`title`),
  KEY `item_id` (`item_id`),
  KEY `source` (`source`),
  KEY `keyword` (`keyword`),
  KEY `title_2` (`item_id`,`title`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=41904 ;


以上是创建表。
现在表里面有35112条数据。

用如下sql语句
SQL code
SELECT * FROM `cj` WHERE item_id = '2' AND title like'%4岁小孩子的心声%' LIMIT 0,20

查询时间6.086470s

用如下sql语句
SQL code
SELECT * FROM `cj` WHERE item_id = '2' AND title like'%4岁小孩子的心声%' order by title LIMIT 0,20

查询时间260.024610s

大家帮帮忙?这是为啥啊?
我也加索引了呀?
为什么会这么慢?

------解决方案--------------------
你看一下执行计划, title 列的索引没有用到,因为like是不是用索引的。

不使用索引,还排序了,肯定会慢。
------解决方案--------------------
你使用了 like'%4岁小孩子的心声%' 导致无法使用索引。 只有KEY `item_id` (`item_id`),被使用了,而相同的item_id = '2'估计很多记录。
------解决方案--------------------
你分析下业务,在title like'%爱4岁小孩子的心声%'这一处想办法,把他改成title like'4岁小孩子的心声%',这样就能用到索引了。

另外你的表都是大字段,varcahr(255)的,不建议查询时用*,需要哪个字段取哪个字段,慷慨在这时候是有害的。