【问题标题】:If your table has more selects than inserts, are indexes always beneficial?如果您的表的选择多于插入,那么索引总是有益的吗?
【发布时间】:2014-04-01 01:14:06
【问题描述】:

我有一个 mysql innodb 表,我在其中使用不同的列执行大量选择。我认为在每个字段上添加索引可以提高性能,但是在阅读了一些索引之后,我不确定在您选择的列上添加索引是否总是有帮助。

在我的情况下,我有比插入/更新更多的选择。

我的桌子“学生”看起来像:

id | student_name | nickname | team | time_joined_school | honor_roll

我有以下疑问:

# The team column is varchar(32), and only has about 20 different values.
# The honor_roll field is a smallint and is only either 0 or 1.
1. select from students where team = '?' and honor_roll = ?;

# The student_name field is varchar(32).
2. select from students where student_name = '?';

# The nickname field is varchar(64).
3. select from students where nickname like '%?%';

所有结果都按time_joined_school排序,这是一个bigint(20)。

所以我只想在每一列上添加一个索引,在这种情况下这有意义吗?

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    索引帮助数据库更有效地查找您正在寻找的数据。也就是说,您不需要仅仅因为您选择了一个给定的列而需要一个索引,但是您(通常)需要一个您选择的列的索引基于 em> - 即使用WHERE 子句(即使您最终没有在结果中包含搜索的列)。

    从广义上讲,这意味着您应该在以逻辑方式分隔数据的列上建立索引,而不是在无关的、简单的信​​息列上建立索引。在查看您的特定查询之前,所有这些列似乎都是索引的合理候选者,因为您可以合理地围绕这些列构建查询。不太有意义的列示例是 phone_numberaddressstudent_notes - 您可以索引这些列,但通常您不需要或不想这样做。

    具体而言,根据您的查询,您需要为 student_nameteamhonor_roll 编制索引,因为您正在根据这些列的值定义 WHERE 条件。如果按照您的建议,您将 ORDER BY 对基于该列的查询进行索引,您还将受益于索引 time_joined_school。对于大多数 RDB 而言,您的 LIKE 查询实际上并不容易处理,而索引 nickname 也无济于事。查看How to speed up SELECT .. LIKE queries in MySQL on multiple columns? 了解更多信息。

    还请注意,SELECTINSERT 的比率对于决定是否使用索引并不是非常相关。即使您只填充表一次,并且从那时起它是只读的,如果您索引正确的列,SELECTs 将运行得更快。

    【讨论】:

      【解决方案2】:

      是的,索引有助于加快查询速度。 在你的情况下,你应该有索引:

      1) 来自查询 1 的 Team 和 Honor_roll(只有 1 个索引和 2 个字段)

      2) 学生姓名

      3) time_joined_school 来自订单

      对于查询 3,由于 like 语句,您不能使用索引。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-11-27
        • 2016-02-25
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        相关资源
        最近更新 更多