我正在尝试执行一个SQL查询,该查询使用 WHERE 子句中的 IN 查询从表中获取数据。
当结果集较小时,它可以正常唤醒,但结果集较高时。 它没有正确使用索引。 表架构就是这样。
CREATE TABLE `users` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`emp_id` bigint(11) NOT NULL,
`xyz_id` varchar(255) NOT NULL, //not unique
PRIMARY KEY (`id`),
KEY `emp_id_user_id_idx` (`emp_id`,`xyz_id`));
查询就像
select * from users where xyz_id = "123" and emp_id in (123, 124, 234, 134);
我是否在想什么,因为结果集很高时会花费太多时间。
说明查询结果。
id: 1
select_type: SIMPLE
table: users
partitions: NULL
type: range
possible_keys: emp_id_user_id_idx,
key: emp_id_user_id_idx
key_len: 1032
ref: NULL
rows: 8366888
filtered: 100.00
Extra: Using index condition
答案 0 :(得分:0)
运行此命令
show index from users;
您将获得一列名为:Seq_in_index
在where
子句中,必须为用于条件的列名称保持该顺序/顺序。喜欢,来自您的查询:
select * from users where xyz_id = "123" and emp_id in (123, 124, 234, 134);
此处xyz_id
列中Seq_in_index
的值应小于emp_id
列,否则索引将无法在此处工作。简单来说,您必须维护订单。
请让我知道是否需要更多说明。
答案 1 :(得分:0)
对于此查询:
select *
from users
where xyz_id = 123 and emp_id in (123, 124, 234, 134);
最佳索引位于users(xyz_id, emp_id)
上。您的索引具有其他顺序的键。
因此,该查询只能使用索引的第一个键(MySQL)。某些数据库支持称为跳扫描的增强索引访问机制,该机制将允许使用索引。 MySQL没有。
如何使用正确的索引? MySQL可以立即使用xyz_id
的值,因为存在相等比较。然后可以选择emp_id
的值。
此外,请注意所使用的类型。如果id是数字,请勿将值与字符串进行比较。同样,这也起作用,存在隐式转换(在这种情况下为常量值),并且转换可能会阻止使用索引。