【问题标题】:indexing large MySQL table索引大型 MySQL 表
【发布时间】:2014-04-22 07:38:46
【问题描述】:

我在索引一个大表时有点迷失了。问题是我需要使用许多不同的过滤器来查询它。以表格为例:

id | key_1 | key_2 | ... | key_n

可能有一个或多个键的过滤器,每个添加(我正在使用 Zend 框架使用准备好的语句构建查询):

$select->where($this->_db->quoteInto('key_n = ?', $filter->key_n));

如果我理解正确以加快查询速度,我应该索引一些列。所以它提出了几个问题:

  • 为所有用于过滤数据的列添加索引是否有意义?
  • 如果我要索引很多列,它将如何影响数据写入表的速度?
  • 通过列组合添加索引是否有意义?

【问题讨论】:

标签: mysql sql indexing


【解决方案1】:

@bodi0 发布的链接有一些答案。但我会添加以下内容:

向所有将要使用的列添加索引是否有意义 过滤数据?

也许吧。通常,索引确实会加快数据检索。但在某些情况下它不会:如果索引列的cardinality 较低,则索引可能没有提供或提供很少的好处,优化器可能会决定忽略它。例如,考虑一个只有两个值“M”或“F”的“性别”列。如果每个都适用于大约 50% 的行,则索引可能提供的改进很少。或者,如果 75% 的记录是“M”并且您正在查询“M”,则很可能根本不会使用索引。

通过列组合添加索引是否有意义?

也许吧。如果您知道某些列组合通常会用于过滤单个SELECT,那么这样的索引可能会证明是有益的。请注意,要使索引可用,它的第一列必须在过滤条件中。例如: 列(gender, state) 上的索引只能在gender(以及可选的state)用作查询中的条件时使用。如果只有state被索引过滤就不会被使用。

然后,鉴于 MySQL 对表的每个查询只使用一个索引,复合索引可能真的很有意义,因为没有它,数据库引擎只能使用一个索引列。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2022-12-31
    相关资源
    最近更新 更多