坚持打卡学习第八天——mysql中文文档学习四
暂时只想知道我应该如何去优化不想知道mysql是怎么优化的,有的解释是真的不好懂,这玩意看的人枯燥死了。。。。。。
1、优化where子句
(1)去除不必要的括号
((a AND b) AND c OR (((a AND b) AND (c AND d))))
结果:(a AND b AND c) OR (a AND b AND c AND d)
(2)常量叠加
(a<b AND b=c) AND a=5
结果: b>5 AND b=c AND a=5
2、优化范围
单元素索引范围条件定义:
(1)对于B-树和Hash索引,使用=,<=>,in,is null,is not null操作符时,关键元素与常量值的比较关系对应一个范围条件
(2)对于B-树索引,当使用>,<,>=,<=,between,!=,<>,或者like 'pattern'(不以通配符开始)操作是,关键元素与常量值的比较关系对应一个范围条件
(3)对于所有索引,多范围条件结合OR或AND则产生一个范围条件
where字句中有范围条件的查询例子:
select * from t1 where key1 > 1 and key2 < 10;
select * from t1 where key1 = 1 or key2 in (14,23,34);
select * from t1 where key1 like 'ad%' or key2 between
'bar' and 'foo';
3、部分非常量值转化为常量
SELECT * FROM t1 WHERE
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b'))
OR (key1 < 'bar' AND nonkey = 4)
OR (key1 < 'uux' AND key1 > 'z');
注:上面的sql中key1是有索引的列,nonkey没有索引
(1)where后面的条件,nonkey=4和like '%b'不能用于范围扫描,使用true替换
(key1 < 'abc' AND (key1 LIKE 'abcde%' OR true))
OR (key1 < 'bar' AND true)
OR (key1 < 'uux' AND key1 > 'z')
(2)取消总是为true或false的条件
(key1 LIKE 'abcde%' OR true)总是为true
(key1 < 'uux' AND key1 > 'z')总是为false
替换结果:
(key1 < 'abc' AND TRUE) OR
(key1 < 'bar' AND TRUE) OR
(FALSE)
(3)删除不必要的true和false
(key1 < 'abc') OR (key1 < 'bar')
(4)将重叠区间组合成一个用于范围扫描的最终条件
(key1 < 'bar')
4、mysql如何优化IS NULL
(1)mysql可以对is null执行和常量等值判断相同的优化,mysql可以利用索引和范围来搜索空值
(2)如果where子句包含一个为空的条件,但是对应列被声明为非空,那么IS NULL条件就会被优化掉
(3)mysql也可以优化组合col_name = expr AND col_name IS NULL,这是解决子查询的一种常用形式。当使用优化时EXPLAIN显示ref_or_null
。。。。。。