|
因此根据具体业务情况建立多列的联合索引是必要的,那么我们来试试吧。
- alter table SC drop index sc_c_id_index;alter table SC drop index sc_score_index;create index sc_c_id_score_index on SC(c_id,score);
执行上述查询语句,消耗时间为:0.007s,这个速度还是可以接收的
执行计划:

该语句的优化暂时告一段落
总结:
- mysql嵌套子查询效率确实比较低
- 可以将其优化成连接查询
- 连接表时,可以先用where条件对表进行过滤,然后做表连接(虽然mysql会对连表语句做优化)
- 建立合适的索引,必要时建立多列联合索引
- 学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要
索引优化
上面讲到子查询的优化,以及如何建立索引,而且在多个字段索引时,分别对字段建立了单个索引
后面发现其实建立联合索引效率会更高,尤其是在数据量较大,单个列区分度不高的情况下。
单列索引
查询语句如下:
- select * from user_test_copy where sex = 2 and type = 2 and age = 10
索引:
- CREATE index user_test_index_sex on user_test_copy(sex);
- CREATE index user_test_index_type on user_test_copy(type);
- CREATE index user_test_index_age on user_test_copy(age);
分别对sex,type,age字段做了索引,数据量为300w,查询时间:0.415s
执行计划:

发现type=index_merge
这是mysql对多个单列索引的优化,对结果集采用intersect并集操作
多列索引
我们可以在这3个列上建立多列索引,将表copy一份以便做测试
- select * from user_test where sex = 2 and type = 2 and age = 10
查询语句:
select * from user_test where sex = 2 and type = 2 and age = 10执行时间:0.032s,快了10多倍,且多列索引的区分度越高,提高的速度也越多
执行计划:

最左前缀
多列索引还有最左前缀的特性,执行一下语句:
- select * from user_test where sex = 2select * from user_test where sex = 2 and type = 2select * from user_test where sex = 2 and age = 10
都会使用到索引,即索引的第一个字段sex要出现在where条件中
索引覆盖
(编辑:清远站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|