数据库索引可以提高搜索效率,在创建数据库的时候,就要考虑到,针对哪个业务字段添加什么样的索引,可以提高数据的查询效率。所以,索引在数据库是有很重要的位置的。今天就来学习一下Mysql 索引有什么需要注意的事项。
从三个维度来分析这个问题:
1.索引哪些情况会失效
2.索引不适合哪些场景
3.索引的一些规则特性
索引哪些情况会失效
查询条件包含or,可能会导致索引失效
如果字段类型是字符串,where时一定要用引号括起来,否则索引失效
like 通配符可能导致索引失效
联合索引,查询时的条件列不是联合索引中的第一个列,否则索引失效
在索引列上使用myql内置函数,索引失效
对索引列运算(如 + - * /),索引失效
索引字段上使用(!= 或者<> ,not in) 时,可能会导致索引失效。
索引字段上使用is null,is not null,可能导致索引失效
左连接查询或者右连接查询关联的字段编码格式不一样,可能导致索引失效
mysql 估计使用全表扫描要比使用索引快,则不使用索引
索引不适用场景
数据量少的不适合加索引
更新比较频繁也不适合加索引
区分度低的不适合加索引(如性别)
索引的一些潜规则
覆盖索引
回表
索引数据结构(B+树)
最左前缀原则
索引下推
覆盖索引
聚集索引:聚集索引,也叫主键索引,,就是根据数据库的主键构建一棵B+树,同时叶子节点存放的就是整张表的记录数据
聚集索引的叶子节点成为数据叶,聚集索引的特性决定了索引组织表中的数据也是索引的一部分
非主键索引,,辅助索引,二级索引 叶子节点 = 键值 + 书签
InnoDb存储引擎 的书签就是相应行数据的主键索引值
索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表读取行了。如果一个索引包含了(或覆盖了) 满足查询语句中字段与条件的数据叫做覆盖索引。
不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,索引MySQL只能使用B-tree 索引做覆盖索引,sql 语句只通过索引,就取到了所需要的数据,这个过程就叫做索引覆盖
索引下推
MysQL 5.6 引入,index condition pushdown,ICP ,有效减少了回表次数,提高了查询效率。
索引下推推出以后,优化器就多了一个选择,就是让存储引擎逐个扫描,筛选出符合数据,这样最终只得到一个数据,只需要回表一次总结下来就是,索引下推逐个扫描并筛选数据花费的时间 < 索引下推减少的回表次数从而节省的时间,即后者时间-前者时间>0,那么就会使用索引下推来优化查询性能
闲抄一下最左匹配原则:
顾名思义:最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>,<,between,like)就会停止查询