五大技巧提高MySQL可扩展性

日期: 2014-11-20 作者:Voja Janjic翻译:杨宏玉 来源:TechTarget中国 英文

当网站上部署小型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。最后,通过主键获取一个随机行。

结论

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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

翻译

杨宏玉
杨宏玉

TechTarget特邀编辑。北京邮电大学计算机科学与技术专业硕士。熟悉软件开发流程,对系统管理,网络配置,数据库应用等方面有深入的理解和实践经验。现就职于IBM(中国)投资有限公司,从事IBM服务器相关软件的开发工作。业余时间喜欢游泳登山,爱健身,喜欢结交朋友。

相关推荐