Mysql入门系列:MySQL查询优化程序
2006-12-31 10:46:06 来源:WEB开发网核心提示: DELETE FROM tb1_nameMySQL对这种特殊情况的DELETE 进行优化;它利用表信息文件中的表说明从头开始创建空数据文件和索引文件,这种优化使DELETE 操作极快,Mysql入门系列:MySQL查询优化程序(5),因为MySQL无需单独地删除每一行,但在某些情况下,有可
DELETE FROM tb1_name
MySQL对这种特殊情况的DELETE 进行优化;它利用表信息文件中的表说明从头开始创建空数据文件和索引文件。这种优化使DELETE 操作极快,因为MySQL无需单独地删除每一行。但在某些情况下,这样做会产生一些不必要的负作用:
■ MySQL报告所涉及的行数为零,即使表不为空也是如此。很多时候这没有关系(虽然,如果事先没有思想准备,会感到困惑不解),但对于那些确实需要知道真实行数的应用程序来说,这是不恰当的。
■ 如果表含有一个AUTO_INCREMENT 列,则该列的顺序编号会以1从头开始。这是真实的事情,即使在MySQL3.23 中对AUTO_INCREMENT 的处理进行了改进后也是这样。关于这个改进的介绍请参阅第2章中的“使用序列”小节。可增加WHERE 1> 0 子句对DELETE 语句“不优化”。
DELETE FROM tb1_name WHERE 1> 0
这迫使MySQL进行逐行的删除。相应的查询执行要慢得多,但将返回真正删除的行数。它还将保持当前的AUTO_INCREMENT 序列的编号,不过只对MyISAM 表(MySQL3.23 以上的版本可用)有效。而对于ISAM 表,序列仍将重置。
■ 避免更新循环不终止。如果更新一个索引列,如果该列用于WHERE 子句且更新将索引值移入至今尚未出超的取值范围内时,有可能对所更新的行进行不终止的更新。假如表my_tbl 有一个索引了的整数列key _ c o l。下列的查询会产生问题:
这个问题的解决方法是在WHERE 子句中将key_col 用于一个表达式,使MySQL不能使用索引:
更多精彩
赞助商链接