目录
前言:
1.最佳左前缀法则
2.主键插入顺序
3.计算、函数、类型转换(自动或手动)导致索引失效
4.范围条件右边的列索引失效
5.不等于(!= 或者<>)导致索引失效
6.is null可以使用索引,is not null无法使用索引
7.like以通配符%开头索引失效
8.OR 前后只要存在非索引的列,都会导致索引失效
9.数据库和表的字符集统一使用utf8mb4
特别鸣谢:
MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度, 因此索引对查询的速度有着至关重要的影响。
大多数情况下都(默认)采用B+ 树来构建索引。只是空间列类型的索引使R- 树,并且MEMORY 表还支持hash索引。其实,用不用索引最终都是优化器说了算。
优化器是基于什么的优化器? 基于cost开销(CostBaseOptimizer) ,它不是基于规则( Rule-BasedOptimizer),也不是基于语义。怎么样开销小就怎么来。另外,SQL 语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。
拓展:Alibaba《Java开发手册》索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。
如果此时再插入一条主键值为9的记录,那它插入的位置就如下图:
#创建一个联合索引,注意字段的顺序create indexidx_age_classid_nameonstudent(age,classid,name);#执行计划EXPLAIN SELECT SQL_NO_CACHE*FROMstudentWHEREstudent.age=30ANDstudent.classId>20ANDstudent.name='abc';
#再创建一个联合索引,与上面的索引对比字段顺序变了
create indexidx_age_name_classidonstudent(age,name,classid);
#再执行一模一样的执行计划
EXPLAIN SELECT SQL_NO_CACHE*FROMstudentWHEREstudent.age=30ANDstudent.classId>20ANDstudent.name='abc';
看到两个执行计划虽然都用到了索引,但是:
拓展:Alibaba《Java开发手册》【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。
以上知识来源于“尚硅谷”,宋红康老师的《MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!》系列课程。
所以本文章看不懂的卷王们可以去搜索宋红康老师的mysql系列课程。