【发布时间】:2011-01-25 04:42:41
【问题描述】:
我有一个至少有几百万行的表和一个包含所有整数的架构,大致如下:
start
stop
first_user_id
second_user_id
使用以下查询提取行:
SELECT *
FROM tbl_name
WHERE stop >= M
AND first_user_id=N
AND second_user_id=N
ORDER BY start ASC
SELECT *
FROM tbl_name
WHERE stop >= M
AND first_user_id=N
ORDER BY start ASC
我无法找出加速这些查询的最佳索引。问题似乎出在 ORDER BY 上,因为当我取出它时,查询速度很快。
我已经使用标准索引格式尝试了所有不同类型的索引:
ALTER TABLE tbl_name ADD INDEX index_name (index_col_1,index_col_2,...)
而且它们似乎都没有加快查询速度。有谁知道什么索引会起作用?另外,我应该尝试不同类型的索引吗?我无法保证每一行的唯一性,所以我避免使用 UNIQUE 索引。
任何指导/帮助将不胜感激。谢谢!
更新:这里是一个索引列表,我最初没有包括这个,因为我采取了一种散弹枪的方法并添加了大量的索引来寻找一个有效的索引:
start_index: [start, first_user_id, second_user_id]
stop_index: [stop, first_user_id, second_user_id]
F1_index: [first_user_id]
F2_index: [second_user_id]
F3_index: [another_id]
test_1_index: [first_user_id,stop,start]
test_2_index: [first_user_id,start,stop]
test_3_index: [start,stop,first_user_id,second_user_id]
test_4_index: [stop,first_user_id,second_user_id,start]
test_5_index: [stop,start]
这里是 EXPLAIN 输出。
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: listing
type: index_merge
possible_keys: stop_index,F1_index,F3_index,test_1_index,test_2_index,test_4_index,test_5_index
key: F1_index,F3_index
key_len: 5,5
ref: NULL
rows: 238
Extra: Using intersect(F1_index,F3_index); Using where; Using filesort
后人更新
我们最终完全重新评估了查询表的方式并选择了这些索引:
index_select_1: [first_user_id,start,stop]
index_select_2: [first_user_id,second_user_id,start,stop]
然后我们使用如下查询在表上进行选择:
SELECT *
FROM tbl_name
WHERE first_user_id=N
AND start >= M
ORDER BY start ASC
SELECT *
FROM tbl_name
WHERE first_user_id=N
AND second_user_id=N
AND start >= M
ORDER BY start ASC
感谢所有回答的人,你们真的帮助我解决了这个问题。
【问题讨论】:
-
在您的查询中发布 EXPLAIN 的输出。
-
您可以尝试在查询上执行
EXPLAIN并将其粘贴到索引列表中吗?可能有助于了解 mysql 正在尝试做什么。 -
等等,another_id 是从哪里来的?从来没有提到过,我很困惑为什么查询分析器会认为它是相关的,因为它甚至没有在 WHERE 中使用。
-
@Malonso,我简化了示例,实际表比我在这里显示的多几列。我根本不打算包含 another_id 索引,除非查询分析器决定使用它,不知道为什么。
-
哪些列最有选择性?
标签: sql mysql indexing database