我有一个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)。
所以我只想在每个列上添加索引,在这种情况下是否有意义?
由于
答案 0 :(得分:1)
是索引帮助您加入查询。 在您的情况下,您应该有索引:
1)来自查询1的团队和honor_roll(只有1个索引,包含2个字段)
2)student_name
3)time_joined_school从订单
对于查询3,由于like语句,您无法使用索引。希望这会有所帮助。
答案 1 :(得分:1)
索引可以更有效地帮助数据库查找您正在寻找的数据。这就是说你不需要一个索引只是因为你选择了一个给定的列,而是你(通常)需要一个索引,你正在选择基于的列 - 即使用WHERE
子句(即使您最终没有在搜索结果中包含搜索到的列)。
从广义上讲,这意味着您应该在列上建立索引,以逻辑方式隔离您的数据,而不是在无关的,信息丰富的列上。在查看特定查询之前,所有这些列似乎都是索引的合理候选者,因为您可以合理地围绕这些列构建查询。不太有意义的列的示例包括phone_number
,address
或student_notes
- 您可以索引此类列,但通常您不需要或不想。
特别是根据您的查询,您需要对student_name
,team
和honor_roll
编制索引,因为您要根据值定义WHERE
条件这些专栏。如果您按照建议time_joined_school
根据该列ORDER BY
查询,那么您还可以从索引LIKE
中受益。您的nickname
查询对于大多数RDB来说实际上并不容易处理,索引SELECT
也无济于事。查看How to speed up SELECT .. LIKE queries in MySQL on multiple columns?了解更多信息。
另请注意,INSERT
与SELECT
的比率与决定是否使用索引并不十分相关。即使您只填充表一次,并且从那一点开始只读,如果您索引正确的列,{{1}}将运行得更快。