【发布时间】:2017-10-27 04:59:29
【问题描述】:
我正在处理这样的表结构 (emp_data)
id dept_id emp_id emp_name role
1 101 1001 Tom Good Worker
2 101 1002 Dick Smart Worker
3 102 1001 Harry Hard Worker
4 103 1001 Kate Nice Worker
5 101 1003 Lucy Great Worker
- id 是无争议的主键 :)
- (dept_id, emp_id) 是多列索引
现在,我需要对 (dept_id, emp_id) 上的组合进行一些非常大的搜索。
我使用这样的元组搜索。
select * from emp_data
where (dept_id, emp_id) in
((101, 1001),
(101, 1002),
(103, 1001));
当表格很长时,这需要相当长的时间。
但如果我这样做,
select * from emp_data
where dept_id in (101, 103)
and (dept_id, emp_id) in
((101, 1001),
(101, 1002),
(103, 1001));
它的速度要快得多,甚至快 100 倍。
这里我不明白的是,
- 为什么即使在索引列上搜索,查询 1 也不快?
---编辑---
我对我的表上的两个查询做了解释。
- 我真的很困惑 mysql 对第一个查询进行全表扫描。这至少可以得出一个结论 - 在 'in' 子句中使用元组搜索时,索引是无用的。
- 第二个查询的行数小于且大约等于结果。这意味着在“in”子句中有一个索引列是可行的。
那么,在 in 子句中使用索引列是不是很糟糕?
【问题讨论】:
标签: mysql database search optimization indexing