面试中经常问到有没有做过Sql优化,每次都感觉是直接到数据优化的层次,都说没有,在此总结一下,主要就是针对查询
1、慢查询
2、索引
3、拆分表
全文索引
主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用.
select * from articles where match(title,body) against(‘database’); 【可以】
唯一索引
unique空串(null)可以放多个 如果是具体的内容则不能重复
a: 在where条经常使用
b: 该字段的内容不是唯一的几个值(sex) (只有三个数据形成2级二叉树)
c: 字段内容不是频繁变化.
查询优化
1.尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描:可以使用联合查询 union all
5.in 和 not in 也要慎用,否则会导致全表扫描,在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替
6.模糊查询like,关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%;“yue%”走索引
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
如:select id from t where age/2 = 10
应改为:select id from t where num = 10*2
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
如:
select id from t where substring(name,1,3) = ’abc’ #name以abc开头的id
select id from t where datediff(day,createdate,’2019-03-09′) = 0 #‘2019-03-09’ --生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate >= '2019-03-09' and createdate < '2019-03-10'
9.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致
10.与having比较,尽量使用where ,where 先过滤(数据就少了)在分组
11.理论上,尽量使用多表连接(join)查询(避免子查询)
2. 尽量使用列名,不要使用*