|
|
|
| Какие есть операторы типа EXPLAIN, для проверки, контроля и просмотра внутренностей и хода выполнения сложных запросов?
Есть еще что-нибудь? | |
|
|
|
|
|
|
|
для: Sfinks
(18.05.2012 в 12:08)
| | Нет, кроме EXPLAIN больше ничего нет. Есть статистика, но она уже не по конкретному запросу, а по всей базе данных. | |
|
|
|
|
|
|
|
для: 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 при этом сплошная Ж....
Как быть-то? Объясните? | |
|
|
|
|
|
|
|
для: Sfinks
(18.05.2012 в 16:23)
| | Чуть попозже отпишусь (завтра уже наверное), ман - редко хорошей документацией является, хорошо, когда она удовлетворительная... | |
|
|
|
|
|
|
|
для: Sfinks
(18.05.2012 в 16:23)
| | В первом запросе у вас фактически один подзапрос, во-втором - три (id - идентифицирует строки, к которым он принадлежит). В первом запросе срабатывает индекс, во втором - нет. Если бы речь шла о миллионах строк, то в первом перебиралось бы количество строк, указанное в row - миллионы, второй запрос бы возможно перебирал бы меньше количество строк за счет своей организации. В любом случае во втором запросе вы теряете индексы, которые бы вам помогли в случае объединения 1 000 000 x 1 000 000, поэтому желательно, чтобы подзапросы так и возвращали в районе 9 или 22 строк - в этом случае объединение плевое и без индексов.
Пока на таких объемах первый запрос выгоднее, чем второй. | |
|
|
|
|
|
|
|
для: cheops
(19.05.2012 в 12:06)
| | А на сколько порядков должно различаться количество обрабатываемых данных, чтоб имело смысл пожертвовать индексом? | |
|
|
|
|
|
|
|
для: Sfinks
(19.05.2012 в 15:35)
| | Самый простецкий критерий - складывайте числа в столбце row, там где получается меньше - там лучше (понятно, что нужно учитывать массу факторов, но в 90% случаев - этот критерий все перешибает). | |
|
|
|
|
|
|
|
для: cheops
(19.05.2012 в 21:21)
| | Хе! Прикольно =) Спасибо! | |
|
|
|