我应该为WHERE子句中的所有字段添加索引吗? - MySQL

时间:2012-07-27 19:48:38

标签: mysql optimization indexing where

在我的程序中,我只有很少的插入,并且任何经常运行的插入都不是立即需要的,因此已经更改为INSERT DELAYED。我应该查看我的代码并查看WHERE子句中引用了哪些字段并为每个字段添加索引?如果是这样,我使用什么类型的索引?它只是放慢速度的插入吗?

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

3 个答案:

答案 0 :(得分:17)

我们可以考虑索引的两个主要位置:WHERE子句中引用的列和JOIN子句中使用的列。简而言之,应该索引这些列,以便您搜索特定记录。

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

blog很好。

答案 1 :(得分:1)

在发现性能问题之前不要更改查询 - 这是过早的优化。相反,使用MySQL查询日志来查看哪些查询需要很长时间,并专注于改进这些查询。

答案 2 :(得分:1)

您应该始终在要在WHERE子句中使用的任何字段添加索引(无论是SELECT,UPDATE还是DELETE)。索引的类型取决于字段中的数据类型以及是否需要每行具有唯一值。通常,默认索引类型(Hash vs. Btree)最好保留默认设置,除非您真的知道自己在做什么。

现在,您是使用单个索引(每个字段一个)还是复合索引类型取决于应用程序的工作方式,并且是一个更高级的主题,所以一般来说,如果只是入门,只需使用和索引每个字段。请注意,主键自动具有索引,因此您无需在这些索引上创建另一个索引。