当前位置:  开发笔记 > 后端 > 正文

MySQL - 如何在WHERE x IN(<subquery>)中使用索引

如何解决《MySQL-如何在WHERExIN(<subquery>)中使用索引》经验,为你挑选了2个好方法。

我正在使用此查询来获取名称以小写字母"a"开头的{客户端}的所有员工:

SELECT * FROM employees 
  WHERE client_id IN (SELECT id FROM clients WHERE name LIKE 'a%')

Column employees.client_id是一个int,有INDEX client_id (index_id).子查询应该IMHO返回一个id-s列表,然后在WHERE子句中使用.

当我EXPLAIN查询时,主查询不使用索引(type:ALL).但是当我EXPLAIN 从子查询(例如SELECT ... WHERE client_id IN (121,184,501))中获取列表时,EXPLAIN切换到type:range,并且此查询的速度提高了50%.

如何使查询使用子查询返回的数据的索引 - 或者,是否有更有效的方法来检索此数据?(将id-list检索到应用程序服务器,加入它并发送第二个查询在这里更加昂贵).

提前致谢.



1> cagcowboy..:
SELECT employees.*
FROM   employees, clients
WHERE  employees.client_id = clients.id
AND    clients.name LIKE 'a%';

应该更快,因为优化者可以选择最有效的计划.在使用子查询编写它时,您强制它按特定顺序执行步骤,而不是让它选择最佳连接顺序.

作为一般规则,应该避免子查询,因为它们通常不如连接查询高性能(尽管在某些情况下它们是不可避免的)



2> mat..:

你有没有尝试用a JOIN而不是subselecct 做这个?

SELECT employees.* FROM employees, clients WHERE employees.client_id = clients.id  AND clients.name LIKE 'a%';

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有