我有非常大的客户数据库。在我添加 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.type
和 customers.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/