+ -
当前位置:首页 → 问答吧 → 加了索引反而比不加索引查询速度来得慢

加了索引反而比不加索引查询速度来得慢

时间:2012-10-20

来源:互联网

本帖最后由 marcofly 于 2012-10-20 16:24 编辑

order_copy数据表的数据量:1千万条
创建order_copy的sql
CREATE TABLE `order_copy` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `shop_id` int(10) NOT NULL,
  `user_id` int(10) DEFAULT NULL,
  `user_name` varchar(32) NOT NULL,
  `food_name` char(64) NOT NULL,
  `food_price` varchar(12) NOT NULL,
  `order_time` datetime NOT NULL,
  `dep_id` tinyint(10) NOT NULL DEFAULT '1',
  `order_state` varchar(10) NOT NULL DEFAULT '未付款',
  `order_team` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
) ENGINE=MyISAM AUTO_INCREMENT=10274827 DEFAULT CHARSET=utf8

添加索引:
执行sql语句:
SELECT * FROM order_copy WHERE user_id=15;
给user_id添加索引前:17s
给user_id添加索引后:76s
记录在慢查询日志中的信息:
# Time: 121020 16:04:47
# Time: 121020 15:43:54
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: [b]17.846021[/b]  Lock_time: 0.001000 Rows_sent: 582308  Rows_examined: 9987858
use dinner;
SET timestamp=1350719034;
-- ALTER TABLE order_copy ENABLE KEYS;
[b]SELECT * FROM order_copy WHERE user_id=5;[/b]

# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: [b]76.796393[/b]  Lock_time: 0.000000 Rows_sent: 734215  Rows_examined: 734215
SET timestamp=1350720287;
-- show INDEX FROM order_copy;
[b]SELECT *  FROM order_copy WHERE user_id=15;[/b]

注:user_id是会重复的



作者: marcofly   发布时间: 2012-10-20

user_id数据中重复的太多了吧

作者: moguidaxing   发布时间: 2012-10-24

分析表 优化表

作者: phptree   发布时间: 2012-10-26

int(10){:soso_e122:}

作者: 剑枫   发布时间: 2012-10-27

不是慢,估计是你有查询缓存了。explain写的很明显:前面一条语句 未用到索引,且要查找900万条,后面的用到了索引,只要查询50多万。
你 select SQL_NO_CACHE ...........  试试

作者: sunceenjoy   发布时间: 2012-11-05

修一下那个表,也许那个表的索引文件坏了

作者: moguidaxing   发布时间: 2012-11-22