mysql - 为什么这个 INNER JOIN/ORDER BY mysql 查询这么慢?

标签 mysql performance indexing sql-order-by limit

我有非常大的客户数据库。在我添加 ORDER BY 之前,这个查询是可以的。如何优化查询速度?

$sql = "SELECT * FROM customers 
LEFT JOIN ids ON customer_ids.customer_id = customers.customer_id AND ids.type = '10'
ORDER BY customers.name LIMIT 10";

ids.typecustomers.name 是我的索引

解释查询

id  select_type  table      type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE       customers  ALL     NULL            NULL    NULL        NULL    955     Using temporary; Using filesort
1   SIMPLE       ids        ALL     type            NULL    NULL        NULL    3551    Using where; Using join buffer (Block Nested Loop)

最佳答案

(我假设您打算输入 ids.customer_id = customer.customer_id 而不是 customer_ids.customer_id)

如果没有 ORDER BY,mysql 会抓取前 10 个类型为 10(索引)的 ID,为他们查找客户,然后就完成了。 (请注意,这里的 LEFT JOIN 实际上是一个 INNER JOIN,因为连接条件只适用于在两个表中都有匹配的行)

使用 ORDER BY mysql 可能会检索所有 type=10 个客户,然后按名字对他们进行排序以找到前 10 个。

您可以通过非规范化客户表(将类型复制到客户记录中)或创建映射表来保存 customer_id、name、type 元组来加快此过程。在任何一种情况下,在 (type, name) 上添加一个索引。如果使用映射表,请使用它与客户和 ID 进行三向连接。

如果 type=10 相当常见,您还可以强制查询按名称遍历 customers 表,并使用 STRAIGHT JOIN 检查每个表的类型。它不会像复合索引那样快,但会比拉出所有匹配项更快。

并且按照上面的建议,对您的查询运行 EXPLAIN 以查看 mysql 正在使用的查询计划。

关于mysql - 为什么这个 INNER JOIN/ORDER BY mysql 查询这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390181/

相关文章:

php 测验脚本,它使用复选框并动态从数据库检索值

list - F# : list. [(参数)..] 匹配模式中的错误

MongoDB 复合索引优化键和范围条件更新

php - 显示来自多个 MySQL 表的数据

java - 身份验证——在java中使用户名和密码全局化

php - 在没有 SQL 注入(inject)的情况下从 mysql 中的用户保存 "Messages"

performance - HMGET 以及字段数量和阅读性能之间的相关性

java - Java声音回放和数据图协调的预录文件

javascript - 异步 modernizr 可以吗?

apache - 选项 + 索引 .htaccess 的样式和替代方案