MySQL数据库优化(三)
2008-06-11 11:04:41 来源:WEB开发网在单独一个表上做 COUNT(*) 而不使用 WHERE 时, 对于 MyISAM 和 HEAP 表就会直接从表信息中检索结果。在单独一个表上做任何表 NOT NULL 达式查询时也是这样做。
预先探测无效的常量表达式。MySQL会快速探测一些不可能的 SELECT 语句并且不返回任何记录。
当没用 GROUP BY 或分组函数时,HAVING 和 WHERE 合并(COUNT(), MIN() 等也是如此)。
为表连接中的每个表构造一个简洁的 WHERE 语句,以得到更快的 WHERE 计算值并且尽快跳过记录。
查询中所有的常量表都会比其他表更早读取。一个常量表符合以下几个条件:
空表或者只有一条记录。
与在一个 UNIQUE 索引、或一个 PRIMARY KEY 的 WHERE 子句一起使用的表,这里所有的索引部分和常数表达式做比较并且索引部分被定义为 NOT NULL。
以下的几个表都会被当成常量表:
SELECT*FROMtWHEREprimary_key=1;
SELECT*FROMt1,t2
WHEREt1.primary_key=1ANDt2.primary_key=t1.id;
MySQL会进各种可能找到表连接最好的连接方法。 如果在 ORDER BY 和 GROUP BY 子句中的所有字段都来自同一个表的话,那么在连接时这个表就会优先处理。
如果有 ORDER BY 子句和一个不同的 GROUP BY 子句,或者如果 ORDER BY 或 GROUP BY 中的字段都来自其他的表而非连接顺序中的第一个表的话,就会创建一个临时表了。
如果使用 SQL_SMALL_RESULT,MySQL就会使用内存临时表了。
所有的表索引都会查询,最好的情况就是所有的索引都会被用到,除非优化程序认为全表扫描的效率更高。同时,数据表扫描是基于判断最好的索引范围超过数据表的30%。 现在,优化程序复杂多了,它基于对一些附加因素的估计,例如表大小,记录总数,I/O块大小,因此就不能根据一个固定的百分比来决定是选择使用索引还是直接扫描数据表。
更多精彩
赞助商链接