2012-07-27 278 views
10

在我的程序中,我有很少的插入,并且任何经常运行的任务都不需要立即进行,因此已被更改为INSERT DELAYED。我是否应该通过我的代码并查看WHERE子句中引用的哪些字段并为它们中的每一个添加索引?如果是的话,我使用什么类型的索引?它只是插入缓慢?我应该为WHERE子句中的所有字段添加一个索引吗? - MySQL

也可以在任何数据类型上使用这些索引?

回答

13

主要有两个地方,我们可以考虑建立索引:使用JOIN子句列在WHERE子句中引用了列。简而言之,应对这些列进行索引,以便搜索特定记录。

  • 只索引那些在WHERE和ORDER BY 条款中所需的列。大量索引列会导致一些缺点。
  • 使用中为您考虑 索引这些列的NOT NULL属性,以便于NULL值永远不会被保存。
  • 使用--log-long-format选项记录未使用 索引的查询。通过这种方式,您可以检查此日志文件并相应地调整您的查询。也是慢查询日志。
  • EXPLAIN语句可以帮助您揭示MySQL将如何执行 查询。它显示了表格的连接方式和顺序。这个 对确定如何编写优化查询非常有用,以及 是否需要对列进行索引。

This blog is good。

1

不要去改变你的查询,你看到一个性能问题之前 - 这是不成熟的优化。相反,使用MySQL查询日志来查看哪些查询需要很长时间,并专注于改进这些查询。

+0

我仍然在开发自己的网站的过程中,所以它似乎是一个更好的主意来释放它尽可能的优化,而不是回来以后解决它。 – 2012-07-27 19:53:36

+1

即使在这个阶段,我也会阻止你提前优化。使用它自己测试网站的性能 - 或者让朋友使用它。然后查看查询日志中的查询速度缓慢。如果可以,尽早启动,而不是进行这种优化。 – 2012-07-27 19:54:25

+4

向WHERE子句中使用的字段添加索引不是过早优化。那就是数据库设计101.当你决定你的表格结构时,它应该总是一个考虑因素。 – 2012-07-27 19:55:41

1

你应该总是在任何领域添加一个索引来在WHERE子句中使用(无论是SELECT,UPDATE或DELETE)。索引的类型取决于字段中数据的类型以及是否需要每一行都具有唯一值。一般来说,默认的索引类型(哈希与Btree)最好留给默认设置,除非你真的知道你在做什么。

现在无论你使用单独的索引(每场一个)或复合索引样的取决于如何应用程序的工作,是一种更先进的主题,所以一般如果刚起步只需使用和索引的每个字段。请注意,您的主键会自动创建索引,因此您无需为这些索引创建另一个索引。

相关问题