一、一些常见的SQL实践
(1)负向条件查询不能使用索引
select * from order where status!=0 and stauts!=1
not in/not exists都不是好习惯
可以优化为in查询:
select * from order where status in(2,3)
(2)前导模糊查询不能使用索引
select * from order where desc like '%XX'
而非前导模糊查询则可以:
select * from order where desc like 'XX%'
(3)数据区分度不大的字段不宜使用索引
select * from user where sex=1
原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。
经验上,能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。
(4)在属性上进行计算不能命中索引
select * from order where YEAR(date) < = '2017'
即使date上建立了索引,也会全表扫描,可优化为值计算:
select * from order where date < = CURDATE()
或者:
select * from order where date < = '2017-01-01'
二、并非周知的SQL实践
(5)如果业务大部分是单条查询,使用Hash索引性能更好,例如用户中心
select * from user where uid=?
select * from user where login_name=?
原因:
B-Tree索引的时间复杂度是O(log(n))
Hash索引的时间复杂度是O(1)
(6)允许为null的列,查询有潜在大坑
单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到“不符合预期”的结果集
select * from user where name != 'shenjian'
如果name允许为null,索引不存储null值,结果集中不会包含这些记录。
所以,请使用not null约束以及默认值。
(7)复合索引最左前缀,并不是值SQL语句的where顺序要和复合索引一致
用户中心建立了(login_name, passwd)的复合索引
select * from user where login_name=? and passwd=?
select * from user where passwd=? and login_name=?
都能够命中索引
select * from user where login_name=?
也能命中索引,满足复合索引最左前缀
select * from user where passwd=?
不能命中索引,不满足复合索引最左前缀
(8)使用ENUM而不是字符串
ENUM保存的是TINYINT,别在枚举中搞一些“中国”“北京”“技术部”这样的字符串,字符串空间又大,效率又低。
三、小众但有用的SQL实践
(9)如果明确知道只有一条结果返回,limit 1能够提高效率
select * from user where login_name=?
可以优化为:
select * from user where login_name=? limit 1
原因:
你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动
(10)把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果
select * from order where date < = CURDATE()
这不是一个好的SQL实践,应该优化为:
$curDate = date('Y-m-d');
$res = mysql_query(
'select * from order where date < = $curDate');
原因:
释放了数据库的CPU
多次调用,传入的SQL相同,才可以利用查询缓存
(11)强制类型转换会全表扫描
select * from user where phone=13800001234
你以为会命中phone索引么?大错特错了,这个语句究竟要怎么改?
(12) 末了,再加一条,不要使用select *(潜台词,文章的SQL都不合格 =_=),
只返回需要的列,能够大大的节省数据传输量,与数据库的内存使用量哟。
引用:
https://mp.weixin.qq.com/s/dGcgts4NNTmVQNRT-j2MZw
-
分享到:
相关推荐
查询sql优化查询 sql查询优化 查询优化sql查询优化 查询优化
海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化 SQL海量数据 优化...
SQL优化 SQL优化软件 SQL优化工具 很好用的工具,可以分析优化TSQL语句,oracle数据库语句优化工具
sql优化sql优化sql优化sql优化
优化sql查询速度优化
sql查询优化总结
ORACLE中SQL查询优化技术.pdf ORACLE中SQL查询优化技术.pdf
sql查询优化 提高MySQL数据库查询效率的几个技巧
SqlServer2008查询性能优化
SQL查询优化,SQL查询优化常用技巧以及注意事项
sql查询优化规则,左右连接,执行计划使用,以提高查询效率
ORACLE SQL性能优化系列 ORACLE SQL性能优化系列 ORACLE SQL性能优化系列
使用性能监视器、SQL Trace以及动态管理视图和函数建立性能基线 理解一般系统中发生瓶颈的...SQL Server 2008查询性能优化》不是理论书籍,它的目的是帮助你避免数据库出现性能低下的状况,它还能帮助你保住你的工作。
SQL查询优化,进行适当的优化,运行速度有了明显地提高
SQL Server SQL优化
SQL优化建议34条SQL优化建议34条
资源名称:SQL Server 2008查询性能优化内容简介:本书通过大量实例,详细介绍了SQL Server数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件...
SqlServer2008查询性能优化,扫描版,不是很清晰,但应该是目前最清晰的了
Sql server2005优化查询速度51法查询速度慢的原因很多,现整理常见几种,大家可以参考下
MS SQL Server查询优化方法 网络资源,备忘