爱陪小樱桃

导航

 

limit问题:

分页查询是常用的场景之一,但也是通常最容易出问题的地方,比如下边的SQL
“select * from tab where type='1'and name ='abc' orderby created_date limit 1000,10”
但是当limit 1000变为limit10000的时候,我们会有疑问为啥我们取10条还这么慢呢?

问题是:数据库不知道10000条记录从什么地方开始,即使有索引也要从头开始计算一次,

在其前端数据浏览,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。
“select * from tab where type='1'and name ='abc' And created_date> '2017-03'orderby created_date limit 10 ”

上边的sql查询的范围基本固定,不会数据增加而发生变化。

隐士转换

sql语句查询变量和字段定义类型不匹配是另一个常见的问题,比如:
explain extended select * from tab where b.bpn=12204000004 and b.liver IS NULL;
其中字段bpn的定义是:varchar(20)
Mysql的策略是将字符串转换为数字之后再比较,函数 作用于表字段,索引失效,

关联更新,删除

虽然MYSQL5.6引入了物化特性,但是需要特别注意,他目前仅仅真对的是查询语句的优化,对于更新和删除需要手工写成Join.写成join之后,对于子查询的模式从:dependent subquery,变为derived执行速度大大加快,从7秒变化为了2毫秒。

混合排序

MYSQL不能利用索引进行混合排序,但是某些场景还是有机会使用特殊方法提升性能的,

exists语句

MYSQL对待 exists语句,仍然采用嵌套子查询的执行方式,如下边的SQL语句,
去掉exists改为join语句,能够避免嵌套子查询。

复杂的sql要是用with的习惯,简洁且思路清晰,能减少数据库的负担。

posted on 2025-08-12 21:35  cherry小樱桃  阅读(6)  评论(0)    收藏  举报