索引可以在查询优化和从表中快速搜索结果中发挥重要作用。所以选择要索引的列是最重要的一步。有两个主要的地方我们可以考虑索引:WHERE 子句中引用的列和 JOIN 子句中使用的列。简而言之,应该为这些列建立索引,您需要根据这些列搜索特定记录。假设我们有一个名为 Buyer 的表,其中 SELECT 查询使用如下索引:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
由于在 SELECT 部分引用了“buyer_id”,MySQL 不会使用它来限制所选行。因此,没有必要对其进行索引。下面是另一个与上面略有不同的示例:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
根据上面的查询 first_name,last_name 列可以被索引,因为它们位于 WHERE 子句中。还可以考虑将来自国家/地区表的附加字段 country_id 用于索引,因为它位于 JOIN 子句中。因此可以考虑对 WHERE 子句或 JOIN 子句中的每个字段进行索引。
以下列表还提供了一些提示,当您打算在表中创建索引时应始终牢记:
- 仅索引 WHERE 和 ORDER BY 子句中需要的那些列。大量索引列会导致一些缺点。
- 尝试利用 MySQL 的“索引前缀”或“多列索引”功能。如果您创建索引,例如 INDEX(first_name, last_name),请不要创建 INDEX(first_name)。但是,并非所有搜索情况都建议使用“索引前缀”或“多列索引”。
- 对您考虑建立索引的列使用 NOT NULL 属性,这样就永远不会存储 NULL 值。
- 使用 --log-long-format 选项记录不使用索引的查询。通过这种方式,您可以检查此日志文件并相应地调整您的查询。
- EXPLAIN 语句可帮助您揭示 MySQL 将如何执行查询。它显示了表的连接方式和顺序。这对于确定如何编写优化查询以及是否需要对列进行索引非常有用。
更新(2015 年 2 月 23 日):
任何索引(好/坏)都会增加插入和更新时间。
根据您的索引(索引数量和类型),搜索结果。如果您的搜索时间会因为索引而增加,那么这就是糟糕的索引。
在任何一本书中,“索引页”都可能有章节起始页、主题页码起始页以及子主题页起始页。索引页面中的一些说明会有所帮助,但更详细的索引可能会使您感到困惑或吓到您。索引也有记忆。
索引选择应该是明智的。请记住,并非所有列都需要索引。