如果您的表具有更多选择而不是插入,索引是否总是有益的?

时间:2014-04-01 01:14:07

标签: mysql

我有一个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)。

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

由于

2 个答案:

答案 0 :(得分:1)

是索引帮助您加入查询。 在您的情况下,您应该有索引:

1)来自查询1的团队和honor_roll(只有1个索引,包含2个字段)

2)student_name

3)time_joined_school从订单

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

答案 1 :(得分:1)

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

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

特别是根据您的查询,您需要对student_nameteamhonor_roll编制索引,因为您要根据值定义WHERE条件这些专栏。如果您按照建议time_joined_school根据该列ORDER BY查询,那么您还可以从索引LIKE中受益。您的nickname查询对于大多数RDB来说实际上并不容易处理,索引SELECT也无济于事。查看How to speed up SELECT .. LIKE queries in MySQL on multiple columns?了解更多信息。

另请注意,INSERTSELECT的比率与决定是否使用索引并不十分相关。即使您只填充表一次,并且从那一点开始只读,如果您索引正确的列,{{1}}将运行得更快。