什么是索引?
好比一本书的目录,它是用来提高我们查找数据的效率的。
MySQL的InnoDB引擎索引的底层算法,其实是一种叶子节点互相连通,改良版的B+Tree的数据结
构。而B+Tree其实是由B-Tree演变而来,而B-Tree的底层原理其实是二叉树!而二叉树查找数据
虽然快,其实是有一个缺点的。就是你如果要更新二叉树上的某个节点,那么那个节点下的所有
子节点都要被拿出来重新排序。这也是索引不能多的原因之一!
相关语法
说明: t_name指表明、index_name索引名、column列名
创建语法:
默认索引:
alter table t_name add index index_name (column)
唯一索引和全文索引把index换成unique和fulltext就行了
在建表的时候创建索引
create [unique|fulltext|spatial] index index_name [算法] on t_name (字段名)
删除:drop index index_name on t_name
查看索引:show index from t_name
使用索引有哪些注意事项?
1.避免使用select * 尽量用索引列替换*,否则虽然使用了索引但却会回表查询。
2.单列索引一般多条件情况下数据库会选出一个最优的来用,用or条件不影响索引。
3.复合索引失效场景:
3.1不遵守最左前缀法则
创建一个索引abc,条件里面单独出现一个a不失效,出现a和b不失效,出现abc不失效。
出现ac也没事只不过现在它只走a索引。
3.2复合索引里使用or条件
or前的条件有索引而or后的没有那么索引都失效!建议使用union
3.3使用复合索引,如果有范围查询的话,该范围查询后面的字段索引会失效。
3.4在索引列上进行运算操作
3.5字符串类型不加单引号
3.6模糊查询%加最前面
3.7not in 不走索引
4.尽量使用复合索引少使用单列索引
5.如果MySQL计算你使用索引还不如使用全表扫描快,那么就会放弃使用索引。
如何查看索引的使用情况

在SQL语句前加上explain关键字可以清除得看到执行情况,key这个列就是索引名,没用到就是null。
问题一、怎么建立索引?精确到表里的字段。
1、 到查询多DML少的表里,选择查询多DML少的列。
2、 怎么确定哪张表查询多DML少?
做得时候自然会清楚。
比如用户表里的账号密码,肯定会分库配置读写分离,到负责读的数据库里建索引就行了。
问题二、为什么比起单列索引要优先考虑复合索引
因为你分别建三个a,b,c的单列索引,你在使用多条件查询的时候,数据库只会优先选取执行效
率最高的那个。
但你建一个为a,b,c的复合索引就不同了,这相当于建立了一个单列索引a,一个复合索引ab一
个复合索引abc。你a找不到就在排除a的基础上接着找ab,再找不到就进一步缩小找abc。
问题三、什么是最左前缀法则
就是在用复合索引abc的时候条件可以单独为a,也可以为a和b,a和b和c。
但不能单独为b单独为c,a和c,b和c。
问题四、什么是回表查询
通过普通索引只是定位到了一个主键索引,再通过这个主键索引真正定位到数据。这个过程虽然
用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。
问题五、模糊查询%不能加最前面,我必须要用怎么办
模糊查询条件比如like”%123”或者like“%123%”都会使索引失效!只有like “123%”能行。
那很多时候又离不开like“%123%”怎么办?
使用覆盖索引!也就是把select *替换成索引列即可