Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверка запроса SELECT
 
 автор: Sfinks   (18.05.2012 в 12:08)   письмо автору
 
 

Какие есть операторы типа EXPLAIN, для проверки, контроля и просмотра внутренностей и хода выполнения сложных запросов?
Есть еще что-нибудь?

  Ответить  
 
 автор: cheops   (18.05.2012 в 13:50)   письмо автору
 
   для: Sfinks   (18.05.2012 в 12:08)
 

Нет, кроме EXPLAIN больше ничего нет. Есть статистика, но она уже не по конкретному запросу, а по всей базе данных.

  Ответить  
 
 автор: Sfinks   (18.05.2012 в 16:23)   письмо автору
 
   для: cheops   (18.05.2012 в 13:50)
 

А как понимать результаты EXPLAIN, не объясните? Я ман прочитал и ниче не понял =(

Вот пример простого двухтабличного запроса:
SELECT name
FROM classes c
JOIN ships s ON s.class = c.class
AND s.launched >=1922
AND c.displacement >35000
его результат:
Iowa
Missouri
Musashi
New Jersey
North Carolina
South Dakota
Washington
Wisconsin
Yamato
и его EXPLAIN:
id | select_type | table | type | possible_keys | key | key_len |   ref    | rows | Extra 
1    SIMPLE        s       ALL     NULL           NULL    NULL      NULL      22    Using where
1    SIMPLE        c      eq_ref   PRIMARY      PRIMARY    44    test.s.class  1    Using where

А вот такой же запрос с тем же результатом, но составленный по другому:
SELECT name FROM
(SELECT class FROM classes WHERE displacement >35000)c
JOIN
(SELECT name, class FROM ships WHERE launched >=1922)s
ON s.class = c.class
и его EXPLAIN:
id | select_type | table | type | possible_keys | key | key_len | ref  | rows | Extra 
1    PRIMARY    <derived2> ALL     NULL           NULL    NULL    NULL    4  
1    PRIMARY    <derived3> ALL     NULL           NULL    NULL    NULL    9     Using where
3    DERIVED    ships      ALL     NULL           NULL    NULL    NULL    22    Using where
2    DERIVED    classes    ALL     NULL           NULL    NULL    NULL    8     Using where

И как и что тут можно понять?
По ману я прочитал. Но логика отказывается это признавать. Т.е. в первом запросе происходит декартово перемножение двух таблиц целиком и получается офигенная матрица из которой происходит выборка аж по 3ем условиям. Но в EXPLAIN вроде все нормально... Т.е. таблиц в работе 2, индекс используется, тип связывания eq_ref, что вроде не плохо.... А второй запрос по логике очень красивый: отбирается несколько строк из 1 таблицы, тоже из второй, результаты перемножаются и из результата, который не велик, происходит выборка по 1 условию. Но в EXPLAIN при этом сплошная Ж....
Как быть-то? Объясните?

  Ответить  
 
 автор: cheops   (18.05.2012 в 20:36)   письмо автору
 
   для: Sfinks   (18.05.2012 в 16:23)
 

Чуть попозже отпишусь (завтра уже наверное), ман - редко хорошей документацией является, хорошо, когда она удовлетворительная...

  Ответить  
 
 автор: cheops   (19.05.2012 в 12:06)   письмо автору
 
   для: Sfinks   (18.05.2012 в 16:23)
 

В первом запросе у вас фактически один подзапрос, во-втором - три (id - идентифицирует строки, к которым он принадлежит). В первом запросе срабатывает индекс, во втором - нет. Если бы речь шла о миллионах строк, то в первом перебиралось бы количество строк, указанное в row - миллионы, второй запрос бы возможно перебирал бы меньше количество строк за счет своей организации. В любом случае во втором запросе вы теряете индексы, которые бы вам помогли в случае объединения 1 000 000 x 1 000 000, поэтому желательно, чтобы подзапросы так и возвращали в районе 9 или 22 строк - в этом случае объединение плевое и без индексов.

Пока на таких объемах первый запрос выгоднее, чем второй.

  Ответить  
 
 автор: Sfinks   (19.05.2012 в 15:35)   письмо автору
 
   для: cheops   (19.05.2012 в 12:06)
 

А на сколько порядков должно различаться количество обрабатываемых данных, чтоб имело смысл пожертвовать индексом?

  Ответить  
 
 автор: cheops   (19.05.2012 в 21:21)   письмо автору
 
   для: Sfinks   (19.05.2012 в 15:35)
 

Самый простецкий критерий - складывайте числа в столбце row, там где получается меньше - там лучше (понятно, что нужно учитывать массу факторов, но в 90% случаев - этот критерий все перешибает).

  Ответить  
 
 автор: Sfinks   (20.05.2012 в 11:09)   письмо автору
 
   для: cheops   (19.05.2012 в 21:21)
 

Хе! Прикольно =) Спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования