【发布时间】:2020-05-10 17:50:34
【问题描述】:
您好,我有 800 万行数据,需要优化 Mysql 查询以从该数据中获取一行。我正在使用以下查询,但它的服务器响应时间太长,导致页面加载速度出现问题
SELECT q.id
, q.title
, q.question
, q.price
, q.created
, q.userid
, q.duedate
, q.tags
, s.id subjectid
, sc.id subcategoryid
, s.title subject
, sc.title subcategory
, q.statusid
, (SELECT COUNT(id) FROM tbl_answers a WHERE a.questionid = q.id AND a.statusid = 1 AND a.deleted = 'N') q_num_answers
, u.username
, u.image
, u.gender
, (SELECT COUNT(id) FROM tbl_answers a WHERE a.userid = q.userid AND a.statusid = 1 AND a.deleted = 'N') num_answers
, (SELECT COUNT(id) FROM tbl_questions WHERE userid = q.userid AND statusid = 1 AND deleted = 'N') AS num_questions
, 0 amt_earned
, 0 amt_spent
, 0 num_sold
, (SELECT COUNT(ur.id) FROM tbl_users_ratings ur WHERE ur.userid = q.userid AND ur.deleted = 'N') u_num_ratings
, (SELECT COALESCE(SUM(ur.rating), 0) FROM tbl_users_ratings ur WHERE ur.userid = q.userid AND ur.deleted = 'N') u_score
FROM tbl_questions q
JOIN tbl_subjects s
ON q.subject = s.id
JOIN tbl_subjects sc
ON q.subcategory = sc.id
LEFT
JOIN tbl_users u
ON u.id = q.userid
WHERE q.deleted = '$show_deleted'
AND q.id = ?
LIMIT 1
【问题讨论】:
-
请注意,没有 ORDER BY 的 LIMIT 是毫无意义的。如果是我,我会看到 Why should I provide an MCRE for what seems to me to be a very simple SQL query? 并重新开始。
-
另外,您对 SQL 注入持开放态度,但我希望您已经意识到这一点。
-
哦,请注意(以及所有相关表的 SHOW CREATE TABLE 语句)有关查询优化的问题始终需要给定查询的 EXPLAIN。
-
@Strawberry Limit without order by 并非毫无意义——它返回那么多行。如果这不是他们想要的,那就不是他们想要的。
-
@Strawberry 和 philipxy 感谢您的帮助。我知道 SQL 注入和其他事情,我只需要帮助来优化我的 sql 查询,因此它需要更少的执行时间。
标签: mysql join subquery database-partitioning mysql-slow-query-log