SQL语句优化
Posted yuanfei1110111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句优化相关的知识,希望对你有一定的参考价值。
1.尽量避免SELECT *命令
从表中读取越多的数据,查询会变得越慢。它会增加磁盘的操作时间,在数据库服务器与web服务器是独立分开的情况下,将会经历非常漫长的网络延迟,而这仅仅是因为不必要的数据在服务器之间进行传输。
2.尽量不要使用BY RAND()命令
如果真需要随机显示结果,有很多更好的途径实现。而这个函数可能会为表中每一个独立的行执行BY RAND()命令——这会消耗处理器的处理能力,然后给你仅仅返回一行。
3.尽量少排序
排序操作会消耗较多的CPU资源
4.尽量少OR
当WHERE子句中存在多个条件以“或”并存的时候,mysql的优化器并没有很好地解决其执行计划优化的问题。再加上MySQL特有的SQL与Storage分层架构方式,造成了其性能比较低下,很多时候使用UNION ALL或UNION代替OR会得到更好的效果。
5.避免类型转换
这里说的“类型转换”,是指WHERE子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,这会导致MySQL无法使用索引。如果非要类型转换,应该在传入参数之前进行转换。
6.不要在列上进行运算
如:SELECT * FROM users WHERE YEAR(adddate) < 2007;,会导致索引失效全表扫描,因此可以改成:
SELECT * FROM users WHERE adddate < ‘2007-01-01‘;
7.尽量不要使用NOT IN和<>操作
(1)NOT IN和<>都不会使用索引,而是进行全表扫描。NOT IN可用NOT EXISTS代替,id <>3可以使用id>3 or id<3;,如果NOT EXISTS是子查询,还可以尽量转换为外连接或者等值连接,要看具体SQL业务逻辑。
(2)把NOT IN转换为LEFT JOIN:
SELECT * FROM customerinfo WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo);
优化:
SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID WHERE salesinfo.CustomerID IS NULL;
8.使用批量插入节省交互(最好使用存储过程)
尽量使用insert intousers(username, password) values (‘test1‘, ‘pass1‘), (‘test2‘, ‘pass2‘), (‘test3‘, ‘pass3‘);
9.对多表关联的查询,建立视图
对多表的关联可能会有性能上的问题,我们可以对多表建立视图,这样操作简单,增加数据安全性。通过视图,用户只能查询和修改指定的数据。并且提高表的逻辑独立性,视图可以屏蔽原有表结构带来的影响。
以上是关于SQL语句优化的主要内容,如果未能解决你的问题,请参考以下文章