WEB开发网
开发学院数据库MySQL MySQL查询优化系列讲座之查询优化器 阅读

MySQL查询优化系列讲座之查询优化器

 2007-11-11 13:40:45 来源:WEB开发网   
核心提示: 重载优化过程这个过程听起来多余,但是有时候你还是希望去掉某些MySQL(和PHP搭配之最佳组合)优化行为的:重载优化器的表联结次序,MySQL查询优化系列讲座之查询优化器(5),使用STRAIGHT_JOIN强迫优化器按照特定的次序使用数据表,在这样操作的时候,因为它必须计算出每一行的值来判断是否能够删除它,这
  重载优化过程

  这个过程听起来多余,但是有时候你还是希望去掉某些MySQL(和PHP搭配之最佳组合)优化行为的:

  重载优化器的表联结次序。使用STRAIGHT_JOIN强迫优化器按照特定的次序使用数据表。在这样操作的时候,你必须对数据表进行排序,这样才能保证第一张表是被选择的行数最少的表。如果你不能确定被选择行数最少的是哪一张表,那么就把行数最多的放到第一的位置。换句话说,试着对表进行排序,使最有约束力的选择出现在最前面。你对可能的备选数据行缩小地越早,执行查询的性能就越好。请确保在带有STRAIGHT_JOIN和不带STRAIGHT_JOIN的时候分别执行该查询。有时候由于某些原因的存在,优化器没有按照你认定的方式联结数据表,STRAIGHT_JOIN也可能没有实际的帮助作用。

  另一个可能性是在联结的数据表列表中的某个表的后面使用FORCE INDEX、USE INDEX和IGNORE INDEX调节符来告诉MySQL(和PHP搭配之最佳组合)如何使用索引。这在优化器没有做出正确选择的时候是有用处的。

  以最小的代价清空一张表。当需要完全地清空一张MyISAM数据表的时候,最快的方法是删除它并利用它的.frm文件中存储的脚本来重新建立它。使用TRUNCATE TABLE语句实现:

TRUNCATE TABLE tbl_name;

  通过重新建立MyISAM数据表来清空它的这种服务器优化措施使该操作非常快,因为不需要单独地逐行删除。

  但是TRUNCATE TABLE也带来了一些副作用,在某些环境中是不符合要求的:

  · TRUNCATE TABLE不一定能够计算出被删除的数据列的精确数量。如果你需要这个数值,请使用不带WHERE子句的DELETE语句:

DELETE FROM tbl_name;

  · 但是,通过重新建立来清空数据表,它可能会把序号的起始值设置为1。为了避免这种情况,请使用"不优化的"全表DELETE语句,它带有一个恒为真的WHERE子句:

DELETE FROM tbl_name WHERE 1;

  添加WHERE子句会强迫MySQL(和PHP搭配之最佳组合)进行逐行删除,因为它必须计算出每一行的值来判断是否能够删除它。这个语句执行的速度很慢,但是它却保留了当前的AUTO_INCREMENT序号。

上一页  1 2 3 4 5 

Tags:MySQL 查询 优化

编辑录入:coldstar [复制链接] [打 印]
赞助商链接