SQL查询不使用索引

时间:2019-07-02 06:59:17

标签: mysql sql performance indexing

我正在尝试执行一个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

2 个答案:

答案 0 :(得分:0)

运行此命令

show index from users;

您将获得一列名为:Seq_in_indexwhere子句中,必须为用于条件的列名称保持该顺序/顺序。喜欢,来自您的查询:

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是数字,请勿将值与字符串进行比较。同样,这也起作用,存在隐式转换(在这种情况下为常量值),并且转换可能会阻止使用索引。