当前位置:  开发笔记 > 编程语言 > 正文

哪些列通常会成为好的索引?

如何解决《哪些列通常会成为好的索引?》经验,为你挑选了4个好方法。

作为" 什么是索引以及如何使用它们来优化我的数据库中的查询? " 的后续内容,我试图了解索引,哪些列是好的索引候选者?专门针对MS SQL数据库?

经过一些谷歌搜索,我读过的所有内容都表明,通常增加和唯一的列会产生一个很好的索引(比如MySQL的auto_increment),我理解这一点,但我使用的是MS SQL,我使用GUID作为主键,所以看来索引不会使GUID列受益......



1> Somnath Mulu..:

索引可以在查询优化中发挥重要作用,并从表中快速搜索结果.因此,选择要编制索引的列是最重要的步骤.我们可以考虑索引的两个主要位置: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来自country表,可以考虑进行索引,因为它在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日):

任何索引(好/坏)都会增加插入和更新时间.

根据索引(索引数和类型),搜索结果.如果你的搜索时间会因为索引而增加,那么那就是糟糕的索引.

可能在任何一本书中,"索引页面"可以有章节开始页面,主题页面编号开始,也可以有子主题页面开始.索引页面中的一些说明有所帮助,但更详细的索引可能会让您感到困惑或吓到您.索引也有记忆.

指数选择应该是明智的.请记住,并非所有列都需要索引.


是的,对计划使用WHERE,JOINS或HAVING的列使用索引.但请记住,所有条件列都不需要索引.有时,条件列只使用一次,因此它可能不需要索引,而其他条件列在许多查询中使用,因此更喜欢索引到该列.

2> SquareCog..:

有些人在这里回答了类似的问题:你怎么知道什么是好的指数?

基本上,它实际上取决于您将如何查询数据.您需要一个索引,可以快速识别与查询相关的数据集的一小部分.如果您从不按日期戳查询,则不需要索引,即使它主要是唯一的.如果您所做的只是获取某个日期范围内发生的事件,那么您肯定需要一个.在大多数情况下,性别指数毫无意义 - 但如果你所做的只是得到关于所有男性的统计数据,并且分别关于所有女性,那么创建一个女性可能是值得的.弄清楚你的查询模式是什么,访问哪个参数最大限度地缩小搜索空间,这是你最好的索引.

还要考虑你所做的索引类型--B树对大多数事物都有好处并且允许范围查询,但是哈希索引会让你直截了当(但不允许范围).其他类型的索引有其他优点和缺点.

祝好运!



3> Plasmer..:

这完全取决于您希望询问有关表格的查询.如果要求列X具有特定值的所有行,则必须执行全表扫描(如果无法使用索引).

索引在以下情况下非常有用:

一列或多列具有高度的独特性

您经常需要为列查找特定值或值范围.

如果符合以下条件,它们将无用

您正在选择表中的大%(> 10-20%)行

额外的空间使用是一个问题

您希望最大化插入性能.表上的每个索引都会降低插入和更新性能,因为每次数据更改时都必须更新它们.

主键列通常非常适合索引,因为它们是唯一的,通常用于查找行.



4> Zooba..:

一般而言(我不使用mssql,因此无法具体注释),主键可以作为良好的索引。它们是唯一的,并且必须指定一个值。(此外,主键会建立良好的索引,因此通常它们会自动创建一个索引。)

索引实际上是已排序以允许二进制搜索(比线性搜索快得多)的列的副本。数据库系统可能会使用各种技巧来进一步加快搜索速度,尤其是当数据比简单数字复杂时。

我的建议是最初不要使用任何索引并配置您的查询。如果经常执行特定查询(例如按姓氏搜索人),请尝试在相关属性和配置文件上再次创建索引。如果查询的速度明显提高,而插入和更新的速度降低得可以忽略不计,则保留索引。

(很抱歉,如果我要重复您在其他问题中提到的内容,我以前没有碰到过。)

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有