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 文件内排序