My SQL数据库实用技术(21)
时间:2007-12-23 来源:不详 作者:迈克DB
■ MySQL 报告所涉及的行数为零,即使表不为空也是如此。很多时候这没有关系(虽然,假如事先没有思想预备,会感到困惑不解),但对于那些确实需要知道真实行数的应用程序来说,这是不恰当的。
■ 假如表含有一个A U TO_INCREMENT 列,则该列的顺序编号会以1 从头开始。这是真实的事情,即使在MySQL 3.23 中对A U TO_INCREMENT 的处理进行了改进后也是这样。关于这个改进的介绍请参阅第2章中的“使用序列”小节。可增加WHERE 1 > 0 子句对DELETE 语句“不优化”。
DELETE FROM tb1_name WHERE 1 > 0
这迫使MySQL 进行逐行的删除。相应的查询执行要慢得多,但将返回真正删除的行数。它还将保持当前的A U TO_INCREMENT 序列的编号,不过只对MyISAM 表(MySQL 3.23 以上的版本可用)有效。而对于ISAM 表,序列仍将重置。
■ 避免更新循环不终止。假如更新一个索引列,假如该列用于WHERE 子句且更新将索引值移入至今尚未出超的取值范围内时,有可能对所更新的行进行不终止的更新。假如表my_tbl 有一个索引了的整数列k e y _ c o l。下列的查询会产生问题:
这个问题的解决方法是在WHERE 子句中将key_col 用于一个表达式,使M y S Q L不能使用索引:
copyright dedecms
实际上,还有另外的方法,即升级到MySQL 3.23.2 或更高的版本,它们已经解决了这样的问题。
■ 以随机次序检索结果。自MySQL 3.23.3 以来,可使用ORDER BY RAND( ) 随机地对结果进行排序。另一技术对MySQL 更旧的版本很有用处,那就是选择一个随机数列,然后在该列上进行排序。但是,假如按如下编写查询,优化程序将会让您的愿望落空:
这里的问题是MySQL 认为该列是一个函数调用,将认为相应的列值是一个常数,而对ORDER BY 子句进行优化,使此查询失效。可在表达式中引用某个表列来蒙骗优化程序。例如,假如表中有一个名为age 的列,可编写如下查询:
■ 忽略优化程序的表连接次序。可利用STRIGHT_JOIN 强迫优化程序以特定的次序使用表。假如这样做,应该规定表的次序,使第一个表为从中选择的行数最少的表。(假如不能肯定哪个表满足这个要求,可将行数最多的表作为第一个表。)换句话说,应尽量规定表的次序,使最有限制性的选择先出现。排除可能的候选行越早,查询执行得就越快。要保证测试相应的查询两次;可能会有某些原因使优化程序不以您所想像的方式对表进行连接,并且STRAIGHT_JOIN 也可能实际上不起作用。
内容来自dedecms
本文来自织梦
上一篇:My SQL数据库实用技术(19) 下一篇:My SQL数据库实用技术(22)
文章评论
共有位Admini5网友发表了评论 查看完整内容