Mysql索引

僤鯓⒐⒋嵵緔 提交于 2020-01-14 02:20:09
1.什么是索引?

索引是帮助mysql高效获取数据的数据结构,mysql索引是B+树结构(B+树:非叶子节点不存储数据,只有叶子节点才存数据)。
索引的类型有:唯一索引,主键索引,组合索引(符合最左匹配原则)和普通索引。

2.索引的优缺点?

优点:
1.提高数据检索的效率,降低数据库IO成本。
2.对索引列进行排序,可以降低排序成本,降低CPU消耗。(order by 的字段是索引字段)

缺点:
1.索引会占据磁盘空间
2.增加了对表增删改操作的时间,在编辑数据库数据时还需要更新对应的索引数据。

3.索引的使用

操作索引:

#新增
create index index_name on table(column)
#修改表 增加索引
alter table table_name add index index_name (column)
#新增唯一索引
create unique index index_name on table(column)
#新增组合索引
alter table table_name add index idx_name_time(name,time);
#删除索引
drop index index_name on table

查看表索引

show index from table_name
4.最左前缀原则

顾名思义,就是最左优先,这个原则是针对组合索引。
1.最左前缀匹配原则在遇到范围条件时,后面的条件就不能用索引了。比如当前有一个组合索引(a,b,c),在写where条件时,a=1 and b>2 and c=3,因为b用了范围查询,索引c=3是不会走索引的;其它的范围查询还包括 < ,between and,like等。
2,where条件后的字段顺序不需要严格按照组合索引定义字段的顺序,只要组合索引中的靠左边的字段有出现在where语句后面,那么就可以用到索引。比如有索引(a,b,c),where语句为c=3 and a=5 and b=4,那么依然可以用到索引;但是如果条件为 c=3 and a=5那么a可以,c就不可能用到索引,因为按最左匹配原则,a出现了,b没有出现,这里就断掉了,后面的字段就不能用到索引。(像第一点,用了范围查询等其他情况除外)

5.索引注意事项

1.不在索引列上做任何操作(计算,函数,(自动或者手动)类型装换)
2.注意符合最左前缀匹配原则
3.mysql使用不等于(!= 或者<>)的时候,无法使用索引,会导致索引失效(可用exists 替换)
4.mysql中使用is not null 或者 is null会导致无法使用索引(如果实在规避不了,建议将条件放在where最后面)
5.mysql中like查询是以%开头,索引会失效。(以 like "张%"不会失效)
6.mysql中,字符串不加单引号索引会失效。(比如name='fay’写成了name=fay,会类型转换导致索引失效)
7.mysql中,如果条件中有or,除非参与or的条件字段都有索引,否则索引失效
8.如果mysql使用全表扫描要比使用索引快,则不会使用到索引

6.一些性能优化细节

1.limit offset,size,当offset太大时,会导致mysql扫描大量不需要的数据;解决办法是:太靠后可以先对字段排序,然后从前面取;或者可以记录上次满足条件的最后一条记录主键,下次分页直接以条件查询的方式查询。
2.尽量不要使用count(*),可以使用count(主键)
3.join两张表,最后关联字段都加上索引,并且字段类型一致
4.用not exists代替not in
5.mysql内置函数不会建立查询缓存。
6.利用慢日志,explain查看执行计划,优化自己的sql
开启慢日志:

vim /etc/my.cnf
#加上如下配置
slow_query_log=ON
#设置慢日志保存位置
slow_query_log_file=xxx
#设置超过几秒,为慢查询
long_query_time=5
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!