使用基数较低的索引是否合理?

我主要是一个Actionscript开发人员,决不是SQL方面的专家,但有时我不得不开发简单的服务器端的东西。 所以,我想我会问更多有经验的人关于标题中的问题。

我的理解是,通过在一个只包含几个不同值的列中设置索引,你并没有太大的收获。 我有一个列保存一个布尔值(实际上它是一个小的int,但我用它作为标志),并且这个列用于大多数查询的WHERE子句中。 在理论上的“平均”情况下,一半的记录值将为1,另一半为0.因此,在这种情况下,数据库引擎可以避免全表扫描,但是无论如何都必须读取很多行(总排/ 2)。

那么,我应该让这个专栏成为一个索引吗?

为了记录,我使用的是Mysql 5,但我更关心为什么它没有意义地索引一个列,我知道这个列的基数很低。

提前致谢。


在下列情况下,索引可以帮助即使在低基数字段:

  • 当其中一个可能值与其他值相比非常不常见时,您可以搜索它。

    例如,色盲女性非常少,所以这个查询:

    SELECT  *
    FROM    color_blind_people
    WHERE   gender = 'F'
    

    最有可能从gender指数中受益。

  • 当这些值趋于按表格顺序分组时:

    SELECT  *
    FROM    records_from_2008
    WHERE   year = 2010
    LIMIT 1
    

    虽然这里只有3不同的年份,但早些年的记录最有可能首先被添加,因此如果不是索引,在返回2010第一个记录之前必须扫描很多记录。

  • 当你需要ORDER BY / LIMIT

    SELECT  *
    FROM    people
    ORDER BY
            gender, id
    LIMIT 1
    

    没有索引,就需要一个文件filesort 。 尽管对LIMIT进行了一些优化,但它仍然需要全表扫描。

  • 索引涵盖查询中使用的所有字段时:

    CREATE INDEX (low_cardinality_record, value)
    
    SELECT  SUM(value)
    FROM    mytable
    WHERE   low_cardinality_record = 3
    
  • 当你需要DISTINCT

    SELECT  DISTINCT color
    FROM    tshirts
    

    MySQL将使用INDEX FOR GROUP-BY ,如果你有很少的颜色,即使有数百万条记录,这个查询也是即时的。

    这是低基数字段上的索引比高基数字段上的索引更高效的场景的示例。

  • 请注意,如果DML性能没有太大的问题,那么创建索引是安全的。

    如果优化器认为索引效率低下,那么索引就不会被使用。


    值得在组合索引中包含布尔值字段。 例如,如果您有一个通常需要按日期排序的大型邮件表,但您也有一个布尔型的已删除字段,因此您经常会像这样查询它:

    SELECT ... FROM Messages WHERE Deleted = 0 AND Date BETWEEN @start AND @end
    

    您肯定会从“已删除”和“日期”字段中获得组合索引。


    我通常会做一个简单的“有指数”与“无”指数测试。 根据我的经验,您可以在使用ORDER BY索引列的查询中获得大部分性能。 如果您对该列进行了任何排序,索引最有可能有所帮助。

    链接地址: http://www.djcxy.com/p/19741.html

    上一篇: Does it make sense to use an index that will have a low cardinality?

    下一篇: Select and copy text to clipboard on double click jQuery