文章目录
limit优化
1 示例表:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_a` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8;
create table t2 like t1;
-- 往t1表插入1万行记录,往t2表插入100行记录
关联查询优化
inner join
嵌套循环连接算法
Nested-Loop Join(NLJ)算法
select * from t1 inner join t2 where t1.a=t2.a
t2是小表,会成为:驱动表,t1是大表:被驱动表
小表驱动大表
1、先从t2取出一行记录
2、再根据刚才取出记录的a,到t1的索引中查找。
3、找到对应t1的行,与t2的结果合并,再作为结果返回客户端
4、重复上面3步,找出所有符合条件的结果
基于块的嵌套循环连接算法
Block Nested-Loop Join(BNLJ)算法
1、将驱动表t2的所有行数据加载到join buffer
2、取出t1的一行记录与join buffter中的所有t2行对比,找到符合的记录
3、重复上面两步,返回所有满足条件的数据。
STRAIGHT_JOIN
IN和EXISTS
COUNT(*)查询优化
官方强烈不建议将字段设置为NULL
尽量所有字段都不能为NULL
mysql索引对NULL值处理不友好
如果是单值索引 ,那么NULL会排到最前面