您的位置: 网界网 > 软件 > 正文

五大技巧提高MySQL可扩展性

2014年12月14日 19:37:04 | 作者:Voja Janjic | 来源:TechTarget中国 | 查看本文手机版

摘要:在处理数据的不断增长时保持良好可用性的能力被称为可扩展性。我们将在下面研究MySQL数据库中最常见的可扩展性的技术。

标签
数据库
处理数据
MySQL

当网站上部署小型MySQL数据库时,面对少量访客的情况下,快慢的查询都足够快,能够提供足够的性能。因此,没有必要进一步的优化查询。然而,随着大量数据(几十万行量级)的出现,网站大量游客访问时,速度在毫秒级的提升都可以对网站的整体性能有十分显著影响。在处理数据的不断增长时保持良好可用性的能力被称为可扩展性。我们将在下面研究MySQL数据库中最常见的可扩展性的技术。需要注意的是,在文中提到的在占磁盘空间195MB的80000行数据表上执行查询的时间是在普通家庭电脑上完成的。

1. MySQL集群

MySQL集群是为数据库管理系统提供高可用性和可扩展性的技术之一。其主要特点是自动数据库分区(自动分片),每个分区和实时响应能力单独写操作通过使用内存中低延迟的表和索引,在每个分区进行独立写操作并实现实时响应。获取有关如何安装和配置MySQL集群的说明,可以点击这里。

2.主键和索引

主键唯一标识数据库表中的每个记录。这意味着每一行都具有用于主键和并且主键的值不允许为空。由于MySQL能够比较快速的处理整数,所以主键列的类型通常是具有自动递增属性的整数类型。自动递增生成的主键值中,下一行的主键值大于前一行的主键值。

主键影响MySQL数据库性能的关键因素。例如,以主键为限定条件选取一条记录(例如SELECT * FROM消息的WHERE news_id = 40000)只需要0.0953s了,而没有主键限定条件的类似查询需要3.6120s的时间才能返回结果。其他类型的索引,如唯一性和关键字约束,也提供了性能上的改进。

3. MySQL查询缓存

MySQL数据库有内置的查询缓存。查询缓存将SELECT查询语句与被发送到客户端的查询结果存储在一起,从而提高查询性能。从一个测试表取出前25行需要0.0821s,但查询被缓存之后,再次执行时间就会是0.0014s。但是,查询缓存有一定的局限性。虽然比原始查询快,但仍比其高速缓存方式慢,如Memcached的或APC。另外,MySQL查询缓存并不是分布式的,这意味着它不能有效地在分布式系统中使用。

4. MySQL的聚合函数

在MySQL中(COUNT,AVG,SUM)等聚合函数是相当缓慢的,构建可扩展的应用程序时应尽量避免使用聚集函数。它们十分缓慢的原因在于(+微信关注网络世界),在where子句中通常会包含一个非索引字段,需要在整个表中进行检查(例如,需要若干对物品的评论,但是需要统计被赞同的评论)。如果不使用这些聚集函数,就应使用某种编程语言(通常是PHP)将结果独立计算出来并存储在数据库中。如果我们使用上面的文章与评论存在一对多关系的例子,文章表应该增加一个附加的字段称为comment_num,这个字段将会存储评论的数量。每当评论获得赞同或删除,该字段都将会被更新。因此,当评论数量需要被显示的时候,只需要在文章表中进行一个查询就足够了。

5. ORDER BY RAND()

在MySQL查询使用ORDER BY RAND()从数据库中取出随机数量的结果是很十分常见的,但这样做效率十分低下且速度缓慢。在测试表中,它需要6.2802s才能获取一行。它之所以如此之慢是因为表首先要进行随机排序,之后才会获取期望数量的结果。这个问题有几个较好的解决方案。其中之一是通过执行以下查询从news表找到最大的ID:SELECT MAX(news_id)。之后,使用PHP中的rand()函数生成随机id。最后,通过主键获取一个随机行。

结论

数据库可扩展性是一个十分复杂的问题,虽然上面技巧是很最常见的,但它们某些需要进一步优化的情况下已经足够。如果您有构建可扩展应用的经验,请在评论中分享您的想法和解决方案。

[责任编辑:软件频道 yu_xiang@cnw.com.cn]