17

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

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

4

3 回答 3

24

有两个主要的地方我们可以考虑索引:WHERE 子句中引用的列和 JOIN 子句中使用的列。简而言之,应该为这些列建立索引,您需要根据这些列搜索特定记录。

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

这个博客很好。

于 2012-07-27T20:00:01.370 回答
3

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

现在,您是使用单个索引(每个字段一个)还是复合索引取决于应用程序的工作方式并且是一个更高级的主题,因此通常如果刚刚开始使用并为每个字段编制索引。请注意,您的主键自动具有索引,因此您无需在这些索引上创建另一个索引。

于 2012-07-27T19:54:52.747 回答
1

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

于 2012-07-27T19:50:31.013 回答