MySQL查询优化程序
2006-04-07 10:45:38 来源:WEB开发网核心提示: ■ 避免更新循环不终止,如果更新一个索引列,MySQL查询优化程序(5),如果该列用于WHERE 子句且更新将索引值移入至今尚未出超的取值范围内时,有可能对所更新的行进行不终止的更新,查询执行得就越快,要保证测试相应的查询两次;可能会有某些原因使优化程序不以您所想像的方式对表进行连接,假如
■ 避免更新循环不终止。如果更新一个索引列,如果该列用于WHERE 子句且更新将索引值移入至今尚未出超的取值范围内时,有可能对所更新的行进行不终止的更新。假如表my_tbl 有一个索引了的整数列key _ c o l。下列的查询会产生问题:
这个问题的解决方法是在WHERE 子句中将key_col 用于一个表达式,使MySQL不能使用索引:
实际上,还有另外的方法,即升级到MySQL3.23.2 或更高的版本,它们已经解决了这样的问题。
以随机次序检索结果。自MySQL3.23.3 以来,可使用ORDER BY RAND( ) 随机地对结果进行排序。另一技术对MySQL更旧的版本很有用处,那就是选择一个随机数列,然后在该列上进行排序。但是,如果按如下编写查询,优化程序将会让您的愿望落空:
这里的问题是MySQL认为该列是一个函数调用,将认为相应的列值是一个常数,而对ORDER BY 子句进行优化,使此查询失效。可在表达式中引用某个表列来蒙骗优化程序。例如,如果表中有一个名为age 的列,可编写如下查询:
忽略优化程序的表连接次序。可利用STRIGHT_JOIN 强迫优化程序以特定的次序使用表。如果这样做,应该规定表的次序,使第一个表为从中选择的行数最少的表。(如果不能肯定哪个表满足这个要求,可将行数最多的表作为第一个表。)换句话说,应尽量规定表的次序,使最有限制性的选择先出现。排除可能的候选行越早,查询执行得就越快。要保证测试相应的查询两次;可能会有某些原因使优化程序不以您所想像的方式对表进行连接,并且STRAIGHT_JOIN 也可能实际上不起作用。
更多精彩
赞助商链接