MYSQL Оптимизация запросов с подзапросами и объединениями - PullRequest
0 голосов
/ 24 января 2020

Привет У меня есть 8 миллионов данных строк и мне нужно оптимизировать запрос 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

1 Ответ

0 голосов
/ 30 января 2020

Эти индексы могут помочь. (Я предполагаю, что id - это PRIMARY KEY каждой таблицы.)

ur:  (deleted, userid, rating)
a:  (deleted, statusid, userid)
a:  (deleted, statusid, questionid)

Пожалуйста, укажите EXPLAIN SELECT ....

Не используйте COUNT(id), если вам не нужно проверьте, что id не является NULL. Обычный способ написать это COUNT(*).

В одном месте вы проверяете предоставленные значения для deleted. В другом вы жестко закодируете это. Возможно, неправильно?

AND  ur.deleted = 'N'

Если PRIMARY KEY для q равно id, то это приведет либо к 1 ряду, либо к отсутствию строки. Чего мне не хватает?

    WHERE  q.deleted = '$show_deleted'
      AND  q.id = ?

(Могут быть и другие советы. Пожалуйста, измените то, что я предложил, и следуйте советам других. Тогда давайте еще раз посмотрим.)

...