下一篇 » « 上一篇

如何编写高效的MySQL应用

作者:晏子    时间:2008-02-29    来源:    点击:4739    本文共10篇文章 字体:[ ]

不要过分使用索引

不要过分使用索引

已经知道索引使查询更快,你可能倾向于索引你表中的每个列。但是得益于索引的性能提高是有代价的,在表中每次执行INSERT、UPDATE、REPLACE或DELETE,MySQL不得不更新表上的每个索引以反映变化。 php学习之家

那么你如何确定何时食用它们呢?最常见的答案是“看情况”。它依赖你运行的查询类型和你运行它们的频度,它依赖于你的数据,它依赖于你的期望和需求。你得到了答案 -- 它依赖于很多事情。

php学习之家

在列上有索引的理由是MySQL缩窄其搜索范围以便尽可能会的匹配行(且避免全表扫描)。你可以认为索引是对列中的每个唯一值只包含一项。在索引中,MySQL必须考虑任何重复值,这些重复值稍微降低效率和索引的用途。

所以在索引一个列之前,考虑数据重复的百分比,如果该百分比太高,你可能觉察不到用索引带来的任何性能改善。

本文来自 www.444p.com

要以更简明的术语描述,它清楚地知道在albums表中索引曲目字段,因为有可能有大量不同的值,而且重复非常少。但如果在albums表中有一个分类列,索引它则可能价值不大,一般的CD收集包含多少不同的类型呢?将会有很多重复的类型值。 本文来自 www.444p.com

另一件要考虑的事情是你的查询可能使用的频度。MySQL只能对出现在一条查询种的WHERE子句中的特定列使用索引,试图回答查询:

[code]SELECT * FROM albums WHERE id = 500[/code]

本文来自 www.444p.com

MySQL不能使用在title上的查询,该查询要求MySQL基于其id查找记录而不是其title。 www.444p.com版权所有

如果你很少使用查询中WHERE子句中的一个列,它可能不值得索引该列。可能在极少的情况下容人全表扫描比要求MySQL在每次修改时保持索引更新总体上更有效些。.

www.444p.com

有疑问时,进行测试。你总能运行某些到索引或不带索引的基准测试看哪一个更快,只要试图让你的基准测试逼真些。如果你的查询有20%是UPDATE,80%是SLEECT,肯定你的基准测试能发映出来,详见MySQL参考手册。 www.444p.com

使用REPLACE查询

有可能你想往表中插入一条记录,除非它已经存在。如果记录已经存在,你想UPDATE它。不是重写代码中做这件事的逻辑,并需运行多个查询,而是MySQL使用REPLACE来做此项工作。

本文来自 www.444p.com

如果id是6的专辑假定有曲目“Shaking the Tree”,你可以这样写查询:

php学习之家

REPLACE INTO albums VALUES (6, 'Shaking the Tree')

本文来自 www.444p.com

重要的是理解REPLACE如何确定一条记录是否在表中存在。MySQL将在表上使用PRIMARY KEY或UNIQUE KEY来执行检查,如果都不存在,REPLACE效果上变成了INSERT。 本文来自 www.444p.com

  • 如何编写高效的MySQL应用 上一页 查询处理
  • 如何编写高效的MySQL应用 总目录
  • 如何编写高效的MySQL应用 下一页 使用临时表
责任编辑:semirock
发表评论
密码: (游客不需要密码)
记住我【Alt+S 或 Ctrl+Enter 快速提交】

搜索工具


《PHP与MYsql》点击排行