需求:
在一个商城(前台/后台)统计查询 需要按照 , 最低或最高(最大/最小)查询销量, 价格, 库存, 评论数... ...的时候一般需要用到mysql中min或者max函数来解决.
但是往往min()或者max()函数往往会造成全表扫描. 那么如何快速查找出自己想要的数据呢, 请看我下面做的测试:
首先来看一下表结构:
CREATE TABLE `biggoods` (
`goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cat_id` int(10) unsigned NOT NULL,
`goods_name` varchar(32) NOT NULL,
`click_count` int(11) NOT NULL DEFAULT '0',
`goods_number` int(11) NOT NULL DEFAULT '0',
`is_delete` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`goods_id`),
KEY `goods_cat_id` (`goods_id`,`cat_id`),
KEY `cat_goods_id` (`cat_id`,`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34143982 DEFAULT CHARSET=utf8 |
goods表中大概有三千万行数据
普通搜索(用min()):
用时4.45毫秒
优化后的搜索:
用时0.00毫米
explain分析结果:
普通语句:
优化后的sql语句:
结尾:
通过explain清楚的看到普通sql语句和优化后的sql语句都进行了index索引扫描, 但是
优化后的sql语句在explain中的rows字段中显示只扫描了1行数据, 而普通语句确扫描了2012行数据. 这一切的缘由就是因为在查询中,
优化后的语句用order by进行排序(索引是自带排序功能的)后limit 1, 使其仅仅进行了1行数据的扫描