mysql如何优化,原理是什么

本文探讨了如何在SQL查询中避免缓存,创建有效的联合索引,并利用最左前缀法则。讲解了索引的使用规则,包括计算、函数处理、类型转换和范围查找等注意事项。重点介绍了覆盖索引的优势以及文件内排序的问题,提供了解决模糊搜索和排序优化的策略。
摘要由CSDN通过智能技术生成

select SQL_NO_CACHE * from test where a = 1 and b = 2 and c = 3
不使用缓存查数据,是比较真实的。
创建a,b,c联合索引。a桥头b桥中c桥尾

1.最左前缀法则
如果建立的复合索引,索引的顺序要安好建立是的顺序,即从左到右。(和B+树的数据结构有关)
ac ;a有效,c无效
bc ;都无效
c ;无效
2.不要对索引做以下处理
计算,如:+、-、*、/、!=、<>、is null、is not null、 or
函数,如sum()、round()等等
手动/自动类型转换,如id=“1”,本来是数字,给写成字符串, 低版本成立,如果mysql 5.7即使你给转类型,也是能走索引的
3.索引字段不要放在范围查找的右边
比如复合索引 a->b->c 。where a = “” and b > 10 and c = “”。这个时候只能用到a和b,c是用不到索引的。因为B+树的结构影响
4.减少select * 的使用
select查询字段和where中使用的索引字段一致;
(1)因为它使用不了覆盖索引,覆盖索引是select的查询字段和where中的查找字段是一致的。比如select 查ab两个字段where 条件里面也是ab两个条件去查询,这里就叫覆盖索引 1。select里面的字段被where里面的检索条件覆盖了。
(2)select * 它会查找很多不必要的字段,在数据库向客户端传输数据的时候,会浪费不必要的性能和网络带宽
5.like模糊搜索
失效情况 like “%张三%” like “%张三”
name like “张三%” 就行了
但是如果想要查 like “%张三%” 怎么样处理呢
用覆盖索引 select name from test where name like “%张三%”
6.order by 优化
当查询语句中使用order by 进行排序时,如果没有使用索引进行排序,会出现filesort文件内排序,这种情况在数据量大或者并发高的时候,会有性能问题。
使用主键索引排序
在SQL语句中强制指定使用某索引,force index(索引名字)
不在数据库中排序,在代码层面进行排序
filesort 2出现的情况举例
order by 字段不是索引
order by 字段是索引字段,但是select中没有使用使用覆盖索引,
如 select * from test order by age asc;
order by 中同时存在ASC升序排序和DESC降序排序,如
select a,b from test order by a desc , b asc;
order by 多个字段排序时,不是按照索引顺序进行order by,即不是按照最左前缀法则,如
select a,b from test order by a

explain sql
type 索引级别
possible_keys 可能用到的索引
key 实际用到的索引
key_len 索引的长度 越小越好
ref 索引级别是ref。(const)说明用的是常量来查找 有几个说明用了几个常量
rows越小越好

索引级别还有range(意思是范围)
index
extra 解释用了哪些 Using index 意思是用到索引排序 Using filesort 文件内排序


  1. 覆盖索引的好处。可以优化like “%a%” 的情况,或者是排序没有走索引的情况 ↩︎

  2. 文件内排序,没有按照索引本身排序,他在内存里面开辟了一份空间,然后把数据复制了一份到空间里面,在空间里面去进行排序,那么这个时候内存就被多占用了一份 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mr.杰瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值