1、但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢?
在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的
2、隐式转换
varchar(20),MySQL 的策略是将字符串转换为数字之后再比较。函数作用于表字段,索引失效。
需要使用函数cast
(sex
as
UNSIGNED
INTEGER
)
3、关联更新、删除
4、
MySQL 不能利用索引进行混合排序。但在某些场景,还是有机会使用特殊方法提升性能的。
5、MySQL 对待 EXISTS 子句时,仍然采用嵌套子查询的执行方式。如下面的 SQL 语句:
改成join 语句查询
6、条件下推
7、提前缩写查询范围,多表关联查询,以最小表记录作为查询主表
8、中间结果集下推
9、
其次: 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a ="1" and b="2" and c > "3" and d = "4" 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,因为c字段进行了范围查询,联合索引失效。如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
果in查询是在符合最左原则的前提下,是可以正常使用的索引的。但是如果in查询的前面有范围查询,那么联合索引失效,自然我们的in查询也就用不到索引了
10、数据量大于千万级别,则考虑分库分表
11、关联表查询的时候,如果性能无法保证,可以采用多表都插入此字段,连带修改,这样保证不用联表查询