powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / подскажите как ускорить запрос
45 сообщений из 45, показаны все 2 страниц
подскажите как ускорить запрос
    #38669125
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
product 50,606 записей
product_to_category 151,818 записей


Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.product_id
FROM product p
LEFT JOIN product_to_category p2c ON ( p2c.product_id = p.product_id )
WHERE p2c.category_id =59
ORDER BY p.sort_order
LIMIT 30 
30 total, Query took 0.1799 sec



explain
Код: plaintext
1.
2.
3.
4.
5.
+----+-------------+-------+--------+--------------------------------+-------------+---------+----------------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                  | key         | key_len | ref                        | rows  | Extra                                        |
+----+-------------+-------+--------+--------------------------------+-------------+---------+----------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | PRIMARY,category_id,product_id | category_id | 4       | const                      | 19768 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | p     | eq_ref | product_id                     | product_id  | 4       | testfashion.p2c.product_id |     1 |                                              |
+----+-------------+-------+--------+--------------------------------+-------------+---------+----------------------------+-------+----------------------------------------------+
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669128
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сразу - зачем лефт джоин?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669139
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex564657498765453,
привычка (

с inner не лучше время
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669161
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSELECT p.product_id
FROM product p

ORDER BY p.sort_order
LIMIT 30

индекс на p.sort_order
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669228
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,
есть уже.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669233
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь за вторжение, вопрос назрел, а тут как раз протестить можно...

Если p2c.category_id = 59 перенести из where в join быстродействие как то изменится? А то часто сталкивался с подобным, и не задумывался, а тут натолкнули на мысль..
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669240
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SharuPoNemnogu,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT p.product_id
FROM product p
LEFT JOIN product_to_category p2c ON ( p2c.product_id = p.product_id
AND p2c.category_id =59 )
ORDER BY p.sort_order
LIMIT 0 , 30

50,606 total, Query took 0.0011 sec


но запрос вернул все id из product
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669249
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно запрос вернул все id из product
так потому что left join наверно
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669256
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SharuPoNemnogu,

туплю, извините
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT p.product_id
FROM product p
INNER JOIN product_to_category p2c ON ( p2c.product_id = p.product_id
AND p2c.category_id =59 )
ORDER BY p.sort_order
LIMIT 30 
Query took 0.1860 sec
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669454
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно ли что-то сделать в этом случае? 0.1-0.2 очень много.
на самом деле итоговый запрос гораздо сложнее, я разбил на части что бы понять что делать.
или это время максимум, что можно выжать из таких таблиц?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669470
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickJOIN product_to_category p2c ON p2c.product_id = p.product_id AND p2c.category_id =59
Индекс на product_to_category(product_id,category_id) ?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669545
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007pavlickJOIN product_to_category p2c ON p2c.product_id = p.product_id AND p2c.category_id =59
Индекс на product_to_category(product_id,category_id) ?


ну тогда скорее наоборот category_to_product(category_id,product_id)
так как изначальный запрос начинается с поиска по категории.
Тогда будет первый селект по индексу только, что убыстрит (особено
если индекс поместится в РАМ)

Как вариант реального убыстрения -- денормализовать
слегка и засунуть сорт_ордер в таблицу продукт_категория

Еще вариант -- попробовать логически улучшить общий
запрос (который нам не показали)
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669618
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,
индекс product_to_category(product_id,category_id) был, добавил category_to_product(category_id,product_id), но скорость не изменилась
денормализовать, засунув сорт_ордер в таблицу продукт_категория я не могу потому как order by может быть не только по sor_order, но ещё по куче полей из product/product_description
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT p.product_id 
FROM product p
   LEFT JOIN product_description pd ON (pd.product_id=p.product_id)
   LEFT JOIN product_to_store p2s ON (p2s.product_id=p.product_id)
   LEFT JOIN product_to_category p2c ON (p2c.product_id=p.product_id)
   WHERE 1
     AND p2c.category_id IN (59)
     AND p.price >=0
     AND pd.language_id = '1'
     AND p.status = '1'
     AND p.date_available <= NOW()
     AND p2s.store_id = 0

ORDER BY p.sort_order ASC, LCASE(name) ASC
LIMIT 30
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669646
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,

ОК, елси вам нужен имено такой запрос , то
можно покапаться в следуюших направлениях:

1. любой СКЛ сопровождайте ЕХПЛАИН-ом и скоростью
(желательно среднее трех прогонов)

2. для чистоты експеримента используйте SQL_NO_CACHE

SELECT SQL_NO_CACHE p.product_id
.........

3. попробуйте добится полной работы индекса (category_id,product_id).
Для этого уберите ВСЕ индексы с таблицы и пересоздайте (category_id,product_id)

После этого запрос

select product_id
from product_to_category
where category_id = 59

должен поиметь запись в ЕХПЛАИН "Using index" и не иметь
"using filesort" "using temporary".

4. Уберите все LEFT. в данном случае это без разницы по результату
но серьезный отрицательный ефект на скорость

5. возможно поиграться со связками -- таблицы можно подсоединять по
продукт_ид ис разных таблиц --- но это следуюшуй этап.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669693
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,
индекс один оставил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT SQL_NO_CACHE p.product_id
FROM product p
INNER JOIN product_to_category p2c ON ( p2c.product_id = p.product_id )
WHERE p2c.category_id =59
ORDER BY p.sort_order
LIMIT 30 

(0.14 sec)



Код: sql
1.
2.
3.
4.
5.
6.
EXPLAIN SELECT p.product_id
FROM product p
INNER JOIN product_to_category p2c ON ( p2c.product_id = p.product_id )
WHERE p2c.category_id =59
ORDER BY p.sort_order
LIMIT 30


Код: plaintext
1.
2.
3.
4.
5.
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys       | key                 | key_len | ref                        | rows  | Extra                                        |
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | category_to_product | category_to_product | 4       | const                      | 19700 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | p     | eq_ref | product_id          | product_id          | 4       | testfashion.p2c.product_id |     1 |                                              |
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669697
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сам запрос без order by sort_order очень быстрый
Код: sql
1.
2.
3.
4.
5.
SELECT p2c.product_id
FROM product_to_category p2c
WHERE p2c.category_id =59
LIMIT 30 
0.0007 sec
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669746
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторSELECT p.product_id
FROM product p

ORDER BY p.sort_order
LIMIT 30

индекс на p.sort_order
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669953
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pavlickmScareCrow,
есть уже.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669954
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickmjavajdbc,
индекс один оставил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT SQL_NO_CACHE p.product_id
FROM product p
INNER JOIN product_to_category p2c ON ( p2c.product_id = p.product_id )
WHERE p2c.category_id =59
ORDER BY p.sort_order
LIMIT 30 

(0.14 sec)



Код: sql
1.
2.
3.
4.
5.
6.
EXPLAIN SELECT p.product_id
FROM product p
INNER JOIN product_to_category p2c ON ( p2c.product_id = p.product_id )
WHERE p2c.category_id =59
ORDER BY p.sort_order
LIMIT 30


Код: plaintext
1.
2.
3.
4.
5.
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+
| id | select_type | table | type   | possible_keys       | key                 | key_len | ref                        | rows  | Extra                                        |
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | category_to_product | category_to_product | 4       | const                      | 19700 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | p     | eq_ref | product_id          | product_id          | 4       | testfashion.p2c.product_id |     1 |                                              |
+----+-------------+-------+--------+---------------------+---------------------+---------+----------------------------+-------+----------------------------------------------+



что-то не работает у вас -- по идее п2ц запрос не должен давать файлсорт/темпорари.
покажите ресультаты:

1)
SHOW CREATE TABLE prodyct_to_category;

2)
скорость и ЕКСПЛЕЙН:
select SQL_NO_CACHE product_id
from product_to_category
where category_id = 59

3)
что бы два раза не вставать
SHOW CREATE TABLE prodyct_to_shop;

4)
скорость и ЕКСПЛЕЙН:
select SQL_NO_CACHE product_id
from product_to_shop
where shop_id = 0

5)
не заморачивайтесь раньше времени с ORDER BY / LIMIT.
На большом запросе все равно это самые последние операции.
Не надо их использовать во время промежуточной оптимизации.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669955
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторне заморачивайтесь раньше времени с ORDER BY / LIMIT.
На большом запросе все равно это самые последние операции.
Не надо их использовать во время промежуточной оптимизации.

плохая фраза. очень. как раз Order by и limit в первую определяют как будет выполнятся запрос.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38669958
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторне заморачивайтесь раньше времени с ORDER BY / LIMIT.
На большом запросе все равно это самые последние операции.
Не надо их использовать во время промежуточной оптимизации.

плохая фраза. очень. как раз Order by и limit в первую определяют как будет выполнятся запрос.


согласно 16165541 , в большом запросе
сортировка/лимит идет после всех
жоинтов и всех филтров.
т.е., напромер, поиск (и его оптимизация) записей в product_to_category
по category_id врядли связан с конечной сортировкой.

Или вы что-то другое хотели сказать?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38670380
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcScareCrowпропущено...


плохая фраза. очень. как раз Order by и limit в первую определяют как будет выполнятся запрос.


согласно 16165541 , в большом запросе
сортировка/лимит идет после всех
жоинтов и всех филтров.
т.е., напромер, поиск (и его оптимизация) записей в product_to_category
по category_id врядли связан с конечной сортировкой.

Или вы что-то другое хотели сказать?

попробуйте запрос из большой таблицы с limit и без. покажите результаты. покажите план.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38670688
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowjavajdbcпропущено...



согласно 16165541 , в большом запросе
сортировка/лимит идет после всех
жоинтов и всех филтров.
т.е., напромер, поиск (и его оптимизация) записей в product_to_category
по category_id врядли связан с конечной сортировкой.

Или вы что-то другое хотели сказать?

попробуйте запрос из большой таблицы с limit и без. покажите результаты. покажите план.


в огороде бузина а в Киеве -- сами знаете...

В оригинале было про "промежуточную" оптимизацию.
(В частности первоначальная выборка продукт_ид из п2ц таблицы)

автор5)
не заморачивайтесь раньше времени с ORDER BY / LIMIT.
На большом запросе все равно это самые последние операции.
Не надо их использовать во время промежуточной оптимизации.


То, что вы говорить, 100% верно, но нужно на последуюших
стадиях оптимизации запроса -- в тот момент когда мыскл будет делать
сорт/лимит.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38670698
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТо, что вы говорить, 100% верно, но нужно на последуюших
стадиях оптимизации запроса -- в тот момент когда мыскл будет делать
сорт/лимит.

эпично. теперь подумайте что такое план запроса, когда он строится? и как на это влияет ORDER BY + LIMIT
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38670718
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

эпично-шмепично...

вы хотите поругатся? ок:

вы зануда и невнимательный читатель.
Мне лень вас тыкать в ту маленькую деталь,
которую вы все время пропускаете.

Успехов.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38671010
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,
1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mysql> SHOW CREATE TABLE product_to_category;
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------+
| Table               | Create Table
                                                                                                                 |
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------+
| product_to_category | CREATE TABLE `product_to_category` (
  `product_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `main_category` tinyint(1) NOT NULL DEFAULT '0',
  KEY `category_to_product` (`category_id`,`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------+
2
Код: sql
1.
2.
3.
4.
select SQL_NO_CACHE product_id
from product_to_category
where category_id = 59
20081 rows in set (0.09 sec)



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
mysql> explain select SQL_NO_CACHE product_id
    -> from product_to_category
    -> where category_id = 59;
+----+-------------+---------------------+------+---------------------+---------------------+---------+-------+-------+-------------+
| id | select_type | table               | type | possible_keys       | key                 | key_len | ref   | rows  | Extra       |
+----+-------------+---------------------+------+---------------------+---------------------+---------+-------+-------+-------------+
|  1 | SIMPLE      | product_to_category | ref  | category_to_product | category_to_product | 4       | const | 19700 | Using index |
+----+-------------+---------------------+------+---------------------+---------------------+---------+-------+-------+-------------+
1 row in set (0.00 sec)
3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mysql> show create table product_to_store;
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------+
| Table            | Create Table
                                                                                   |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------+
| product_to_store | CREATE TABLE `product_to_store` (
  `product_id` int(11) NOT NULL,
  `store_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`product_id`,`store_id`),
  KEY `product_id` (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------+

4
Код: sql
1.
2.
3.
4.
SELECT SQL_NO_CACHE product_id
FROM product_to_store
WHERE store_id =0
50606 rows in set (0.03 sec)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
mysql> explain SELECT SQL_NO_CACHE product_id
    -> FROM product_to_store
    -> WHERE store_id =0;
+----+-------------+------------------+-------+---------------+---------+---------+------+-------+--------------------------+
| id | select_type | table            | type  | possible_keys | key     | key_len | ref  | rows  | Extra                    |
+----+-------------+------------------+-------+---------------+---------+---------+------+-------+--------------------------+
|  1 | SIMPLE      | product_to_store | index | NULL          | PRIMARY | 8       | NULL | 50606 | Using where; Using index |
+----+-------------+------------------+-------+---------------+---------+---------+------+-------+--------------------------+

5 без order by запрос летает
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38671154
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,

ну хорошо, от фалсорт и темпорари уже избавились
на начальных филтрах.

Дальше имеет смысл проверить несколько вариантов
жестких связок, например:


Оригинал:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT SQL_NO_CACHE p.product_id 
FROM product p
   JOIN product_description pd ON (pd.product_id=p.product_id)
   JOIN product_to_store p2s ON (p2s.product_id=p.product_id)
   JOIN product_to_category p2c ON (p2c.product_id=p.product_id)
   WHERE 1
     AND p2c.category_id IN (59)
     AND p.price >=0
     AND pd.language_id = '1'
     AND p.status = '1'
     AND p.date_available <= NOW()
     AND p2s.store_id = 0
ORDER BY p.sort_order ASC, LCASE(name) ASC
LIMIT 30



жесткий порядок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT SQL_NO_CACHE p.product_id 
FROM product_to_category p2c
STRAIGHT_JOIN product_to_store p2s 
       ON (p2s.product_id=p2c.product_id  
             AND p2s.store_id = 0 )
STRAIGHT_JOIN product_description p2s  pd 
       ON (pd.product_id=p2c.product_id 
             AND pd.language_id = '1')
STRAIGHT_JOIN product p 
       ON (p.product_id=p2c.product_id 
            AND p.price >=0
            AND p.status = '1'
            AND p.date_available <= NOW())
WHERE p2c.category_id = 59
ORDER BY p.sort_order, LCASE(name) ASC
LIMIT 30



Приведит скорость и EXPLAIN.
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38671156
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея предыдушего поста -- подобрать
оптимальный порядок подсоединения таблиц,
при котором первыми используются фильтры с
максимальной отсечкой -- я продпологаю это п2ц (19К),
потом product_to_store ......
пардон, он ничего не отсекает, как было 50К продуктов, так и
50К связок на сторе_ид=0 --- его последним фильтром дать,
потом , наверно продукт сам и потом продукт_декриптион.
Точнее скзать можно если подсчитать кардиналити
продуктовых колонок. Т.е вот такое наверно будет самое быстрое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT SQL_NO_CACHE p.product_id 
FROM product_to_category p2c
STRAIGHT_JOIN product p 
       ON (p.product_id=p2c.product_id 
            AND p.price >=0
            AND p.status = '1'
            AND p.date_available <= NOW())
STRAIGHT_JOIN product_description p2s  pd 
       ON (pd.product_id=p2c.product_id 
             AND pd.language_id = '1')
STRAIGHT_JOIN product_to_store p2s 
       ON (p2s.product_id=p2c.product_id  
             AND p2s.store_id = 0 )
WHERE p2c.category_id = 59
ORDER BY p.sort_order, LCASE(name) ASC
LIMIT 30



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

Для очистки совести, сколько записей выдает?:

Код: sql
1.
2.
3.
4.
select count(1)
from  p.price >=0
 AND p.status = '1'
 AND p.date_available <= NOW()



если меньше чем 19К, то можно поставить это таблицу первой.
Тогда продется вернуть индекс продуцт_ид_категори_ид в П2Ц
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672175
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
mysql> SELECT count( 1 )
    -> FROM product p
    -> WHERE p.price >=0
    -> AND p.status = '1'
    -> AND p.date_available <= NOW( ) ;
+------------+
| count( 1 ) |
+------------+
|      50606 |
+------------+
1 row in set (0.06 sec)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT SQL_NO_CACHE p.product_id
FROM product_to_category p2c
STRAIGHT_JOIN product p ON ( p.product_id = p2c.product_id
AND p.price >=0
AND p.status = '1'
AND p.date_available <= NOW( ) )
STRAIGHT_JOIN product_description pd ON ( pd.product_id = p2c.product_id
AND pd.language_id = '1' )
STRAIGHT_JOIN product_to_store p2s ON ( p2s.product_id = p2c.product_id
AND p2s.store_id =0 )
WHERE p2c.category_id =59
ORDER BY p.sort_order, LCASE( name ) ASC
LIMIT 30 
(0.38 sec)


explain
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                  | key                 | key_len | ref                              | rows
| Extra                                        |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | category_to_product                            | category_to_product | 4       | const                            | 19700
| Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | p     | eq_ref | product_id,status,date_available,price,price_2 | product_id          | 4       | testfashion.p2c.product_id       |     1
| Using where                                  |
|  1 | SIMPLE      | pd    | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p.product_id,const   |     1
| Using where                                  |
|  1 | SIMPLE      | p2s   | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p2c.product_id,const |     1
| Using index                                  |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672188
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

0.38 sec всё что моо выжать?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672222
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи наконец create table для product
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672387
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickmjavajdbc,

0.38 sec всё что моо выжать?

ну отсортировать 19К записей --- фиг его знает, может это
и предел на вашем железе. Вы не показали скорости/Експлейн
остальных двух запросов. И шоу креате табле продукт,
как уже запросил ScareCrow.

Может поменять p.productid na
SELECT SQL_NO_CACHE p2c .product_id...........
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672473
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT SQL_NO_CACHE p.product_id 
FROM product p
   JOIN product_description pd ON (pd.product_id=p.product_id)
   JOIN product_to_store p2s ON (p2s.product_id=p.product_id)
   JOIN product_to_category p2c ON (p2c.product_id=p.product_id)
   WHERE 1
     AND p2c.category_id IN (59)
     AND p.price >=0
     AND pd.language_id = '1'
     AND p.status = '1'
     AND p.date_available <= NOW()
     AND p2s.store_id = 0
ORDER BY p.sort_order ASC, LCASE(name) ASC
LIMIT 30
0.3912 sec


explain
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                  | key                 | key_len | ref                              | rows
| Extra                                        |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | category_to_product                            | category_to_product | 4       | const                            | 19700
| Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | p     | eq_ref | product_id,status,date_available,price,price_2 | product_id          | 4       | testfashion.p2c.product_id       |     1
| Using where                                  |
|  1 | SIMPLE      | pd    | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p2c.product_id,const |     1
|                                              |
|  1 | SIMPLE      | p2s   | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p2c.product_id,const |     1
| Using index                                  |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT SQL_NO_CACHE p.product_id
FROM product_to_category p2c
STRAIGHT_JOIN product_to_store p2s ON ( p2s.product_id = p2c.product_id
AND p2s.store_id =0 )
STRAIGHT_JOIN product_description pd ON ( pd.product_id = p2c.product_id
AND pd.language_id = '1' )
STRAIGHT_JOIN product p ON ( p.product_id = p2c.product_id
AND p.price >=0
AND p.status = '1'
AND p.date_available <= NOW( ) )
WHERE p2c.category_id =59
ORDER BY p.sort_order, LCASE( name ) ASC
LIMIT 30
0.3921 sec


explain
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                  | key                 | key_len | ref                              | rows
| Extra                                        |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+
|  1 | SIMPLE      | p2c   | ref    | category_to_product                            | category_to_product | 4       | const                            | 19700
| Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | p2s   | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p2c.product_id,const |     1
| Using index                                  |
|  1 | SIMPLE      | pd    | eq_ref | PRIMARY,product_id                             | PRIMARY             | 8       | testfashion.p2c.product_id,const |     1
|                                              |
|  1 | SIMPLE      | p     | eq_ref | product_id,status,date_available,price,price_2 | product_id          | 4       | testfashion.p2s.product_id       |     1
| Using where                                  |
+----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------------------------+-------
+----------------------------------------------+

Код: sql
1.
SHOW CREATE TABLE `product` 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
| product | CREATE TABLE `product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `model` varchar(64) NOT NULL,
  `sku` varchar(64) NOT NULL,
  `upc` varchar(12) NOT NULL,
  `location` varchar(128) NOT NULL,
  `quantity` int(4) NOT NULL DEFAULT '0',
  `stock_status_id` int(11) NOT NULL,
  `image` varchar(255) DEFAULT NULL,
  `manufacturer_id` int(11) NOT NULL,
  `shipping` tinyint(1) NOT NULL DEFAULT '1',
  `price` decimal(15,4) NOT NULL DEFAULT '0.0000',
  `points` int(8) NOT NULL DEFAULT '0',
  `tax_class_id` int(11) NOT NULL,
  `date_available` date NOT NULL,
  `weight` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `weight_class_id` int(11) NOT NULL DEFAULT '0',
  `length` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `width` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `height` decimal(15,8) NOT NULL DEFAULT '0.00000000',
  `length_class_id` int(11) NOT NULL DEFAULT '0',
  `subtract` tinyint(1) NOT NULL DEFAULT '1',
  `minimum` int(11) NOT NULL DEFAULT '1',
  `sort_order` int(11) NOT NULL DEFAULT '0',
  `status` tinyint(1) NOT NULL DEFAULT '0',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `date_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `viewed` int(5) NOT NULL DEFAULT '0',
  UNIQUE KEY `product_id` (`product_id`),
  KEY `model` (`model`),
  KEY `sku` (`sku`),
  KEY `upc` (`upc`),
  KEY `manufacturer_id` (`manufacturer_id`),
  KEY `sort_order` (`sort_order`),
  KEY `status` (`status`),
  KEY `date_available` (`date_available`),
  KEY `price` (`price`),
  KEY `price_2` (`price`,`status`),
  FULLTEXT KEY `index5` (`model`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672474
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT SQL_NO_CACHE p2c.product_id
0.3873 sec
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672491
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,


у меня идеи почти кончились.
Осталась одна левая -- все таки сделать
product.product_is PRIMARY ключем.


Как в том анекдоте:
-- а поможет?
-- ну по крайней мере не помешает!
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672526
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm ,

а если с приподвывертом?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT p.product_id 
FROM product p
WHERE p.status = '1' AND p.date_available <= NOW()
  AND EXISTS(
    SELECT 1 FROM product_description pd 
    WHERE (pd.product_id=p.product_id) AND pd.language_id = '1'
  ) AND EXISTS(
    SELECT 1 FROM product_to_store p2s 
    WHERE (p2s.product_id=p.product_id) AND p2s.store_id = 0
  ) AND EXISTS(
    SELECT 1 FROM product_to_category p2c 
    WHERE (p2c.product_id=p.product_id) AND p2c.category_id IN (59) AND p.price >=0
  )
ORDER BY p.sort_order
LIMIT 30;
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672527
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неточно внес p.price, ну да идея понятна...
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38672738
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторAND p.price >=0
AND p.status = '1'
AND p.date_available <= NOW( ) )
WHERE p2c.category_id =59
ORDER BY p.sort_order, LCASE( name ) ASC

убрать LCASEу name

и сделать индекс sort_order, name price status date_available

выкинуть не самые селективные поля
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673500
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SELECT p.product_id
FROM product p
WHERE p.status = '1'
AND p.date_available <= NOW( )
AND p.price >=0
AND EXISTS (

SELECT 1
FROM product_description pd
WHERE (
pd.product_id = p.product_id
)
AND pd.language_id = '1'
)
AND EXISTS (

SELECT 1
FROM product_to_store p2s
WHERE (
p2s.product_id = p.product_id
)
AND p2s.store_id =0
)
AND EXISTS (

SELECT 1
FROM product_to_category p2c
WHERE (
p2c.product_id = p.product_id
)
AND p2c.category_id
IN ( 59 )
)
ORDER BY p.sort_order
LIMIT 30 


0.1265 sec
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673559
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,

а план можно глянуть?
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673626
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+--------------------+-------+--------+-------------------------------------+---------------------+---------+--------------------------------+------+------
-------+
| id | select_type        | table | type   | possible_keys                       | key                 | key_len | ref                            | rows | Extra
       |
+----+--------------------+-------+--------+-------------------------------------+---------------------+---------+--------------------------------+------+------
-------+
|  1 | PRIMARY            | p     | index  | status,date_available,price,price_2 | sort_order          | 4       | NULL                           |   30 | Using
 where |
|  4 | DEPENDENT SUBQUERY | p2c   | ref    | category_to_product                 | category_to_product | 8       | const,testfashion.p.product_id |    1 | Using
 index |
|  3 | DEPENDENT SUBQUERY | p2s   | eq_ref | PRIMARY,product_id                  | PRIMARY             | 8       | testfashion.p.product_id,const |    1 | Using
 index |
|  2 | DEPENDENT SUBQUERY | pd    | eq_ref | PRIMARY,product_id                  | PRIMARY             | 8       | testfashion.p.product_id,const |    1 | Using
 index |
+----+--------------------+-------+--------+-------------------------------------+---------------------+---------+--------------------------------+------+------
-------+
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673644
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,

еще ускорить можно только заменой USING WHERE на USING INDEX - но для этого нужен покрывающий индекс из пяти полей (из четырех, если превратить PRODUCT_ID в первичный ключ) - стоит ли?

Можно попробовать оценить селективность, например, так
Код: sql
1.
2.
3.
4.
5.
6.
SELECT count(*) total,
  SUM(p.price >=0) qty_price,
  SUM(p.date_available <= NOW()) qty_date,
  SUM(p.status = '1') qty_status
FROM product p
--  в том числе WHERE EXISTS(...)

чем меньше QTY, тем ближе к SORT_ORDER в покрывающем индексе
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673677
pavlickm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Код: plaintext
1.
2.
3.
4.
5.
+-------+-----------+----------+------------+
| total | qty_price | qty_date | qty_status |
+-------+-----------+----------+------------+
| 20081 |     20081 |    20081 |      20081 |
+-------+-----------+----------+------------+
1 row in set (0.48 sec)
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673682
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm,

ээээ... а зачем условия в фильтре писать, если все строки таблицы под него подходят на 100%
...
Рейтинг: 0 / 0
подскажите как ускорить запрос
    #38673688
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavlickm, а, я понял.

Первый результат интересен вообще без фильтров
Второй - только с фильтрами WHERE EXISTS, без фильтрации по PRODUCT
...
Рейтинг: 0 / 0
45 сообщений из 45, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / подскажите как ускорить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]