Mysql索引

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值