0
点赞
收藏
分享

微信扫一扫

mysql8.0 之 sql 优化《六》 之 优化示例 总览 总结


索引合并优化

可以使用Index Merge的示例查询:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name
WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2
WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2
WHERE t1.key1 = 1
AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

如果您的查询具有​​WHERE​​ 带深度and/or 嵌套的复杂子句 且MySQL未选择最佳计划,请尝试使用以下身份转换来分发术语:

 

(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)

索引合并不适用于全文索引。

 

IS NULL优化

假设列​​a​​​和 ​​b​​​表上有索引,优化的查询的一些示例​​t2​​:

SELECT * FROM t1 WHERE t1.a=expr OR t1.a IS NULL;

SELECT * FROM t1, t2 WHERE t1.a=t2.a OR t2.a IS NULL;

SELECT * FROM t1, t2
WHERE (t1.a=t2.a OR t2.a IS NULL) AND t2.b=t1.b;

SELECT * FROM t1, t2
WHERE t1.a=t2.a AND (t2.b=t1.b OR t2.b IS NULL);

SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL AND ...)
OR (t1.a=t2.a AND t2.a IS NULL AND ...);

​ref or null​​​首先对引用键执行读操作,然后单独搜索具有​​NULL​​键值的行。

优化只能处理一个 is null 级别。在以下查询中,MySQL仅对表达式使用键查找,​​(t1.a=t2.a AND t2.a IS NULL)​​​并且无法使用关键部分​​b​​:

SELECT * FROM t1, t2
WHERE (t1.a=t2.a AND t2.a IS NULL)
OR (t1.b=t2.b AND t2.b IS NULL);

 

 

文章持续更新,转发表明出处,方便更新!

 

 

 

 

举报

相关推荐

0 条评论