之前小白写了一篇: 面试中Mysql索引的用法和利弊,楼下有人评论说:百万级的数据怎么优化查询??对于这个问题,小白百度了一些大佬们写的文章,在加上自己在项目中总结的一丢丢经验,斗胆写下了这篇博文,写的不好,大家别笑,希望下面写的内容能帮到看到的朋友们/xieyanxiao。
说了那么多废话,下面直接进入主题吧:
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 (关于索引的用法和利弊,大家可以参考一下面试中Mysql索引的用法和利弊)。
2、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致搜索引擎放弃使用索引而进行全表扫描。例如:下面这个sql,可以这样用union all 来替换or来提高查询速度
select id,name from table where state=10 or state=20
//可以这样查询:
select id,name from table where state=10
union all
select id,name from table where state=20
3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,例如:可以在state 上设置默认值0,确保表中state 列没有null值,然后这样查询:
select id,name from table where state is null
//优化后
select id,name from table where state state = 0
4、同上,尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
5、尽量减少in 和 not in 的使用频率,否则会导致全表扫描,如果条件可以的话,使用between … and …代替in或not in
6、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。例如:
select id,name from table where state/2=100
//优化后
select id,name from table where state=100*2
7、尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至少保证不要使用全模糊查询,对于右模糊查询是会使用索引的,例如:
select id,name from table where name like 'abc%'
对于左模糊查询,无法直接使用索引,例如:
select id,name from table where name like '%abc'
对于全模糊查询,小白个人感觉是不能优化的,还是对全表进行扫描,例如:
select id,name from table where name like '%abc%'
8、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
9、对于“in”,用 exists 代替 in 算是一个比较好的选择:
select id,name from table where name like '%abc%'
select id,name from table1 where state in(select state from table2)
//优化后
select id,name from table1 where exists(select 1 from table2 where state =table1.state)
10、任何地方都不要使用 select * from t ,用具体的字段列表代替 “*”,不要返回用不到的任何字段。
……
当然,小白列出来的这几中方法只不过是sql优化的冰山一角,但小白还是希望整理出来的这方案能搞帮到看到的朋友们/xianyanxiao。
业精于勤,荒于嬉---------自带小尾巴