优化MySQL数据库性能的八大“妙手”

2008-02-23 07:36:57来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法。

  1、选取最适用的字段属性

  MySQL能够很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在他上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们能够将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,假如将其配置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就能够很好的完成任务了。同样的,假如能够的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。

  另外一个提高效率的方法是在可能的情况下,应该尽量把字段配置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

  对于某些文本字段,例如“省份”或“性别”,我们能够将他们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又能够提高数据库的性能。

  2、使用连接(JOIN)来代替子查询(Sub-Queries)

  MySQL从4.1开始支持SQL的子查询。这个技术能够使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就能够利用子查询先从销售信息表中将任何发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:

DELETE FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

  使用子查询能够一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也能够避免事务或表锁死,并且写起来也很容易。但是,有些情况下,子查询能够被更有效率的连接(JOIN).. 替代。例如,假设我们要将任何没有订单记录的用户取出来,能够用下面这个查询完成:

SELECT * FROM customerinfo
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )

  假如使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:

SELECT * FROM customerinfo
LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.
CustomerID
WHERE salesinfo.CustomerID IS NULL

  连接(JOIN).. 之所以更有效率一些,是因为 MySQL无需在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

共4页。 1 2 3 4 :

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 让MySQL完全支持中文

下一篇: 在PHP中全面阻止SQL注入式攻击之一