加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

一次非常有趣的SQL优化经历

发布时间:2019-04-05 17:09:28 所属栏目:MySql教程 来源:风过无痕
导读:场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: createtableCourse( c_idintPRIMARYKEY, namevarchar(10) ) 数据100条 学生表: createtableStudent( idintPRIMARYKEY, namevarchar(10) ) 数据70000条 学生成绩表SC: CREATEtableSC( sc_idin

而c_id=81 and score=84 的结果是897,即这两个字段联合起来的区分度是比较高的,因此建立联合索引查询效率将会更高,从另外一个角度看,该表的数据是300w,以后会更多,就索引存储而言,都是不小的数目,随着数据量的增加,索引就不能全部加载到内存,而是要从磁盘去读取,这样索引的个数越多,读磁盘的开销就越大,因此根据具体业务情况建立多列的联合索引是必要的,那么我们来试试吧。

  1. alter table SC drop index sc_c_id_index;  
  2. alter table SC drop index sc_score_index;  
  3. create index sc_c_id_score_index on SC(c_id,score); 

执行上述查询语句

消耗时间为:0.007s

这个速度还是可以接受的

执行计划:

该语句的优化暂时告一段落

总结:

  •  mysql嵌套子查询效率确实比较低
  •  可以将其优化成连接查询
  •  连接表时,可以先用where条件对表进行过滤,然后做表连接

  (虽然mysql会对连表语句做优化)

  •  建立合适的索引,必要时建立多列联合索引
  •  学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要

索引优化

上面讲到子查询的优化,以及如何建立索引,而且在多个字段索引时,分别对字段建立了单个索引

后面发现其实建立联合索引效率会更高,尤其是在数据量较大,单个列区分度不高的情况下。

单列索引

查询语句如下:

  1. select * from user_test_copy where sex = 2 and type = 2 and age = 10 

索引:

  1. CREATE index user_test_index_sex on user_test_copy(sex);  
  2. CREATE index user_test_index_type on user_test_copy(type);  
  3. CREATE index user_test_index_age on user_test_copy(age); 

分别对sex,type,age字段做了索引,数据量为300w

查询时间:0.415s

执行计划:

发现type=index_merge

这是mysql对多个单列索引的优化,对结果集采用intersect并集操作

多列索引

我们可以在这3个列上建立多列索引,将表copy一份以便做测试

  1. create index user_test_index_sex_type_age on user_test(sex,type,age); 

查询语句:

  1. select * from user_test where sex = 2 and type = 2 and age = 10 

执行时间:0.032s

快了10多倍,且多列索引的区分度越高,提高的速度也越多

执行计划:

最左前缀

多列索引还有最左前缀的特性:

都会使用到索引,即索引的第一个字段sex要出现在where条件中

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!