MySQL数据库优化(三)
http://tech.ddvip.com 2008年06月11日 社区交流
内容摘要:这个章节讲述了优化程序如何处理 WHERE 子句。例子中使用了 SELECT 语句,但是在 DELETE 和 UPDATE 语句中对 WHERE 子句的优化是一样的。注意,关于MySQL优化的工作还在继续,因此本章节还没结束。MySQL做了很多优化工作,而不仅仅是文档中提到的这些。
在 EXPLAIN 的结果中,这种方法在 type 字段中表现为 index_merge。这种情况下,key 字段包含了所有使用的索引列表,并且 key_len 字段包含了使用的索引的最长索引部分列表。
例如:
SELECT*FROMtbl_nameWHEREkey_part1=10ORkey_part2=20;
SELECT*FROMtbl_name
WHERE(key_part1=10ORkey_part2=20)ANDnon_key_part=30;
SELECT*FROMt1,t2
WHERE(t1.key1IN(1,2)ORt1.key2LIKE'value%')
ANDt2.key1=t1.some_col;
SELECT*FROMt1,t2
WHEREt1.key1=1
AND(t2.key1=t1.some_colORt2.key2=t1.some_col2);
5. MySQL 如何优化 IS NULL
MySQL在 col_name IS NULL 时做和 col_name = constant_value 一样的优化。例如,MySQL使用索引或者范围来根据 IS NUL L搜索 NULL。
SELECT*FROMtbl_nameWHEREkey_colISNULL;
SELECT*FROMtbl_nameWHEREkey_col<=>NULL;
SELECT*FROMtbl_name
WHEREkey_col=const1ORkey_col=const2ORkey_colISNULL;
如果一个 WHERE 子句包括了一个 col_name IS NULL 条件,并且这个字段声明为 NOT NULL,那么这个表达式就会被优化。当字段可能无论如何都会产生 NULL 值时,就不会再做优化了;例如,当它来自一个 LEFT JOIN 中右边的一个表时。
MySQL 4.1.1或更高会对连接 col_name = expr AND col_name IS NULL 做额外的优化, 常见的就是子查询。EXPLAIN 当优化起作用时会显示 ref_or_null。
优化程序会为任何索引部分处理 IS NULL。
以下几个例子中都做优化了,假使字段 a 和 表 t2 中 b 有索引了:
作者:叶金荣 责编:豆豆技术应用