码迷,mamicode.com
首页 > 数据库 > 详细

SQL语句优化

时间:2019-01-12 20:55:33      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:字段   执行   date   带来   之间   上进   延迟   cpu   数据库服务   

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语句优化

标签:字段   执行   date   带来   之间   上进   延迟   cpu   数据库服务   

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10260859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!