我需要帮助。我有一个查询,我运行从两个表中获取数据,但它消耗了大量内存,需要9秒才能获取大约100条记录。我可能需要在某个时刻获取多达200k的记录。请问如何优化此查询?
SELECT user_id AS id, name, address, phone, city, book_title
FROM users us LEFT OUTER JOIN
(SELECT bid, GROUP_CONCAT(DISTINCT book_title SEPARATOR ' ')
AS book_title FROM user_books GROUP BY bid)bo ON bo.bid = us.user_id
在user_books表上,我为一些用户提供了多个book_titles条目,我想返回一个结果,其中包括所有用户都是否有书名和book_title在一列中。
我为查询运行了一个sql explain语句并得到了这个
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 PRIMARY us ALL NULL NULL NULL NULL 168272
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 65900
2 DERIVED user_books ALL NULL uid 4 NULL 164989
注意:我在各自的表格中有列bid,book_title,user_id,姓名,地址,电话,城市的索引。
请提出任何有关如何提升表现的建议。
答案 0 :(得分:1)
为什么需要创建派生表?为什么不这样:
SELECT
user_id, name, address, phone, city, GROUP_CONCAT(DISTINCT book_title SEPARATOR ' ') book_title
FROM
users us
LEFT OUTER JOIN user_books ub ON ub.bid = us.user_id
GROUP BY us.user_id
答案 1 :(得分:1)
试试这个 - 多比这里给出的其他答案更高效。这样做可以避免在确定每个user_id的分组时产生大量开销,并且如果需要,您可以随时从users表中为选择添加WHERE子句。
SELECT
*,
( SELECT GROUP_CONCAT(DISTINCT book_title SEPARATOR ' ')
FROM user_books ub
WHERE ub.bid=us.id
) AS book_title
FROM
( SELECT user_id AS id, name, address, phone, city, book_title
FROM users
) us