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
7.mysql调优思路
查看当前慢日志相关参数
show variables like '%quer%'
修改参数值(在数据库重启后就没了,永久有效需要修改配置文件)
# 开启慢查询
set global slow_query_log=on
# 设置慢查询时间 单位秒
set global long_query_time=1
查看慢查询数量
show status like '%slow_queries%';
确定慢查询sql后就可以用explain分析sql了
explain select name from person order by name desc;
# 注意 type rows 和extra
强制查询走某个索引(force index(index_name))
explain select count(id) from student force index(primary)
其它常用命令:
# 查看事务隔离级别
select @@tx_isolation
# 设置session事务隔离级别(read uncommitted | read committed)
set sesssion transaction isolation level repeatable read;
# 设置开启事务 提交事务 回滚事务
start transaction;
commit;
rollback;