Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Оптимизация СЕЛЕКТА

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
esterio
Отправлено: 23 Апреля, 2013 - 18:15:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




ЕСТ запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         SUM(IF(type LIKE 'Q-PS-AR', 1, 0)) AS 'Q-PS-AR',
  3.         SUM(IF(type LIKE 'Q-PS-ST', 1, 0)) AS 'Q-PS-ST',
  4.         SUM(IF(type LIKE 'Q-PS-WP', 1, 0)) AS 'Q-PS-WP'
  5. FROM
  6.         test_questions Q
  7. WHERE
  8.                 id NOT IN (
  9.                         SELECT DISTINCT question_id FROM test_answers WHERE user_id = 325682 AND started > 0
  10.                 )
  11.                 AND
  12.                         Q.type != 'Q-PS-'
  13.                 AND
  14.                         weight >= 0
  15.                 AND
  16.                         weight <= 60


Время 450-550 мс.
EXPLAIN


Я переделал так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         `type`,
  3.         COUNT(*) AS `c_type`
  4. FROM
  5.         test_questions Q
  6. WHERE
  7.                 Q.type IN('Q-PS-AR', 'Q-DS-ST', 'Q-PS-WP')
  8.         AND
  9.                 id NOT IN (
  10.                         SELECT question_id  FROM test_answers WHERE user_id = 325682 AND started > 0 GROUP BY question_id
  11.                 )
  12.         AND
  13.                 weight >= 0
  14.         AND
  15.                 weight <= 60
  16. GROUP BY `type`

Время 4000450 мс.
Explain


Вопрос
1. почему такая малая разница?
2. можна както- все ето оптимизировать?
 
 Top
EuGen Администратор
Отправлено: 23 Апреля, 2013 - 18:42:25
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Будет весьма сложно дать ответ, не зная ни точной структуры таблиц, ни её индексации.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 23 Апреля, 2013 - 20:21:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Можно попробовать переписать в join
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         `type`,
  3.         COUNT(*) AS `c_type`
  4. FROM
  5.         test_questions Q
  6.         LEFT JOIN (
  7.         SELECT question_id  FROM test_answers WHERE user_id = 325682 AND started > 0 GROUP BY question_id
  8.         ) q_answers ON question_id=id
  9. WHERE
  10.                 Q.type IN('Q-PS-AR', 'Q-DS-ST', 'Q-PS-WP')
  11.         AND
  12.                 question_id IS NULL
  13.         AND
  14.                 weight >= 0
  15.         AND
  16.                 weight <= 60
  17. GROUP BY `type`


Для второго вашего и моего запроса можно попробовать сделать индекс по type & weight


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 25 Апреля, 2013 - 20:06:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Спасибо. Уже разобрался. На таблице в 1000 строк разница практически отсутствует.
http://stackoverflow[dot]com/questio[dot][dot][dot]ization-in-vs-or
здесь расписали кстати. В даном случае IN не использовал индекс, что и не позволило ускорить запрос существенно. Почему так не знаю
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2013 - 21:30:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




esterio пишет:
Почему так не знаю

Такое может быть, если оптимизатор посчитал селективность ключа недостаточной, чтобы его использовать. В ряде случаев, тем не менее, он ошибается и можно попробовать указать USE INDEX, чтобы изменить план запроса вручную.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
esterio
Отправлено: 25 Апреля, 2013 - 21:43:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




EuGen пишет:
можно попробовать указать USE INDEX, чтобы изменить план запроса вручную

Буду блгодарен если кинете силку или покажите маленкий пример использования
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2013 - 21:52:58
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Для запроса в комментарии Сергея:
CODE (SQL):
скопировать код в буфер обмена
  1.     SELECT
  2.             `type`,
  3.             COUNT(*) AS `c_type` USE INDEX `your_index_by_type`
  4.     FROM
  5.             test_questions Q
  6.             LEFT JOIN (
  7.             SELECT question_id  FROM test_answers WHERE user_id = 325682 AND started > 0 GROUP BY question_id
  8.             ) q_answers ON question_id=id
  9.     WHERE
  10.                     Q.type IN('Q-PS-AR', 'Q-DS-ST', 'Q-PS-WP')
  11.             AND
  12.                     question_id IS NULL
  13.             AND
  14.                     weight >= 0
  15.             AND
  16.                     weight <= 60
  17.     GROUP BY `type`


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB