-
表结构
CREATE TABLE s1 ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), key2 INT, key3 VARCHAR(100), key_part1 VARCHAR(100), key_part2 VARCHAR(100), key_part3 VARCHAR(100), common_field VARCHAR(100), PRIMARY KEY (id), KEY idx_key1 (key1), UNIQUE KEY idx_key2 (key2), KEY idx_key3 (key3), KEY idx_key_part(key_part1, key_part2, key_part3) ) Engine=InnoDB CHARSET=utf8;
-
五百万数据
1.select count(*) from s1;(查看数据量)
-
select * from s1 where id=288;(主键等值查询)
-
select * from s1 where id=288;(主键范围查找)
select * from s1 where id>78888;
select * from s1 where id>78888 and id<90000;
select * from s1 where id>78888 and id<90000 or id >100000;
(说明:在多个and条件下,使用的是一个字段的索引,并不需要多次(IO)检索数据页,而是找到最开始那条数据,然后走B+树的叶子节点的双向链表,只是走链表扫描的行数有差别,然后时间会有一点差别) -
select key1 from s1 where key1=“z0A”;(二级索引等值查找,走覆盖索引)
select key1 from s1 where key1>“z0A”;(二级索引范围查找,走覆盖索引)
select * from s1 where key1=“z0A”;(二级索引等值查找,不走覆盖索引)
select * from s1 where key1>“z0A”;(二级索引范围查找,不走覆盖索引)
(说明:这里key1是一个二级索引,直接select后面是*和key1是有差别的,执行时间差别就是在于需要回表,回表记录条数越多,执行时间也越多) -
select * from s1(直接走的聚簇索引全表扫描);
(说明:500万条数据全表扫描也是4ms,和走索引范围查询等值查询一样) -
select * from s1 where key1>“a0A”;(走了二级索引,然后回表进行的全表扫描(查询的数据量超过了一定比例,扫表效率反而高,对于二级索引来说,每条数据回表成本很高的))
- 五百万数据试验总结
1.全表扫表执行时间4ms,数据网络传输80ms
2.二级索引全表扫描的情况下,要发生回表,需要40ms,扫表建议直接走聚簇索引B+进行扫表
3.范围查询记录比较多,能走覆盖索引走覆盖索引,否则回表效率低,性能急剧下降
4.走二级索引的情况下,使用不了覆盖索引,那么查询字段的数量个数多少的执行时间没多大差别,主要是网络传输时间