[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите разобраться с запросом
maximka787
Мужики, привет. Есть БД mysql, всего одна таблица:

CREATE TABLE `pages` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`parent_id` smallint(5) unsigned NOT NULL,
`type_page` tinyint(3) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`brand_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM AUTO_INCREMENT=13842 DEFAULT CHARSET=utf8;


В таблице есть и категории и товары ( `type_page`: 1-категория, 2-товар)

Делаю запрос на вывод категорий и количества товаров в каждой:

SELECT t1.`id`, (SELECT COUNT(*) FROM `pages` t2 WHERE t2.`parent_id` = t1.`id` AND t2.`type_page` = 2)  
FROM `pages` t1 WHERE t1.`type_page` = 1


1) Во первых, он долгий, но судя по всему сократить его никак нельзя

2) Также смутило то, что при удалении поля `brand_name`, которое вообще роли не играет, на 30-40% быстрее запрос стал выполняться.

Подскажите, почему так происходит?

_____________
..Работает - не трогай!
maximka787
Забыл дописать, оптимизацию таблицы делал, не влияет на скорость.

_____________
..Работает - не трогай!
S.Chushkin
Цитата (maximka787 @ 30.08.2017 - 18:18)
Подскажите, почему так происходит?

"Индексы, индексы и ещё раз индексы", как завещал великий гуру

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (maximka787 @ 30.08.2017 - 18:18)
...

Мульён первый раз: забудьте про MyISAM!

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
maximka787
Цитата (S.Chushkin @ 30.08.2017 - 14:55)
Цитата (maximka787 @ 30.08.2017 - 18:18)
Подскажите, почему так происходит?

"Индексы, индексы и ещё раз индексы", как завещал великий гуру

Так индексы тут не при чем. На толе brand_name нет индекса и по нему условия тоже нет. Оно ж вообще не участвует в запросе.

_____________
..Работает - не трогай!
maximka787
Цитата (S.Chushkin @ 30.08.2017 - 14:57)
Цитата (maximka787 @ 30.08.2017 - 18:18)
...

забудьте про MyISAM!

Я всегда делаю InnoDB. но в данном случае таблица всего одна, а посему, смысла в InnoDB нет. Как раз MyISAM тут в отрыве.

_____________
..Работает - не трогай!
depp
большая таблица?
S.Chushkin
Цитата (maximka787 @ 31.08.2017 - 11:42)
Так индексы тут не при чем.

"Жираф большой, ему видней" (с) Высоцкий

Цитата
На толе brand_name нет индекса и по нему условия тоже нет. Оно ж вообще не участвует в запросе.

Не путай тёплое с мягким.
Добавь правильные индексы и не заморачивайся тем, чем не надо.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (maximka787 @ 31.08.2017 - 11:45)
...а посему, смысла в InnoDB нет. Как раз MyISAM тут в отрыве.

"Жираф большой, ему видней" (с) Высоцкий wink.gif

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
maximka787
Ну мне интересно знать, почему таблица с одним полем работает медленно, а без него на порядок быстрее smile.gif
Вес таблицы на 10-20% меньше поле удаления этого VARCHAR(255). Да и инфы то там мало, не все заполнены, а те, что заполнены по слову одному чаще всего.

_____________
..Работает - не трогай!
S.Chushkin
Цитата (maximka787 @ 31.08.2017 - 13:54)
...а без него на порядок быстрее smile.gif

Где дуришь?
Цитата: "на 30-40% быстрее".

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
А суть проста.
1) При полном скане таблицы, чем меньше размер данных, тем быстрее выборка.
2) Я _сильно_ сомневаюсь, что после удаления поля скорость выборки увеличилась на 40%. 1-2% - да, возможно. Больше вряд-ли.
Скорее всего, ты проводил тесты не в идентичных условиях.
Например, замерять время надо на 3-4 разе (подряд) выполнения запроса, чтобы исключить/минимизировать время чтения с диска, заполнения беферов, подсчёта статистики и пр.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
sergeiss
Цитата (maximka787 @ 30.08.2017 - 18:18)
1) Во первых, он долгий, но судя по всему сократить его никак нельзя

Так насчет индексов я не понял. Есть ли они тут и если есть, то какие?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
T1grOK
Коррелированные подзапросы у mysql, до сих пор, через одно место оптимизируется


SELECT t1.`id`, COUNT(t2.id)
FROM `pages` t1
LEFT JOIN `pages` t2 ON t2.`parent_id` = t1.`id` AND t2.`type_page` = 2
WHERE t1.`type_page` = 1
GROUP BY t1.id


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
killer8080
maximka787
почитай
https://ruhighload.com/post/Работа+с+индексами+в+MySQL
думаю будет полезно wink.gif

PS форум ломает ссылку с кириллицей, просто скопипасти текст rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.