百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> 不为人知的10条SQL语句优化
分享文章到:

不为人知的10条SQL语句优化

发布时间:09/01 来源:未知 浏览: 关键词:

一、一些常见的SQL实践

(1)负向前提查询不克不及使用索引

select * from order where status!=0 and stauts!=1

not in/not exists都不是好习惯

引荐 《mysql视频教程

可以优化为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索引么?大错特错了,这个语句毕竟要如何改?

末了,再加一条,不要使用select *,只返回需要的列,能够大大的节约数据传输量,与数据库的内存使用量哟。

本文来自百分百源码网,mysql教程栏目,欢迎学习!

以上就是不为人知的10条SQL语句优化的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板