powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql Нужна помощь с оптимизацией запроса
18 сообщений из 18, страница 1 из 1
mysql Нужна помощь с оптимизацией запроса
    #40024473
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте, прошу помощи с оптимизацией запроса. Я не знаю можно ли его с оптимизировать или нет, по этому и обращаюсь к знатокам
Итак сам запрос,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	
SELECT `t1`.`idlinks`, `t1`.`market_name`, `t1`.`img`, `t1`.`title`, `t1`.`url`, `t1`.`hash_url`, `t1`.`scale`, `t1`.`brand`, `t1`.`price`, `t1`.`cyti`, `t1`.`available`, `t1`.`date_create`, `t2`.`idmarkets`, `t2`.`title` AS `name`, `t2`.`url` AS `path` 
FROM `links` `t1` 
  LEFT JOIN `markets` `t2` ON t2.idmarkets= t1.market_name 
  LEFT JOIN `seo_data` `t3` ON t3.hash_item= t1.hash_url 
WHERE (`t1`.`price` != '0') AND (`t1`.`price` BETWEEN 0 AND 1000000) 
ORDER BY CAST(t1.price AS UNSIGNED INTEGER) 
LIMIT 15


Выполняется он 49438.5 ms
По данным
таблица links - 400-450 тыс. записей
Индексы на полях
market_name
hash_url
scale
brand
price

таблица markets - около 100 записей
Индексы на полях
idmarkets

Таблица seo_data - 400-450 тыс. записей
hash_item
Данные из неё не используются, используется для фильтрации лишнего

его EXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range price_fx price_fx 138 179977 Using index condition; Using filesort
1 SIMPLE t2 eq_ref PRIMARY,fx_markets_id PRIMARY 4 links.t1.market_name 1 Using where

Вопрос, можно ли как-то ускорить, если да то как?
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024483
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name,

Покажите DDL таблиц.
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024487
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name
Код: sql
1.
WHERE (`t1`.`price` != '0') AND (`t1`.`price` BETWEEN 0 AND 1000000) 

А что вы хотели сделать этой строчкой?
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024495
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
Nick-name
Код: sql
1.
[SRC sql]WHERE (`t1`.`price` != '0') AND (`t1`.`price` BETWEEN 0 AND 1000000) 


[/src]
А что вы хотели сделать этой строчкой?

Пардон это рудимент сейчас вот так
Код: sql
1.
WHERE  (`t1`.`price` BETWEEN 0 AND 1000000) 
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024498
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Nick-name,

Покажите DDL таблиц.

Что вы имеете ввиду?
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024500
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name
miksoft
Nick-name,

Покажите DDL таблиц.

Что вы имеете ввиду?
Результат команды SHOW CREATE TABLE.
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024508
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

links
Код: 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.
CREATE TABLE `links` (
   `idlinks` bigint(20) NOT NULL AUTO_INCREMENT,
   `img` varchar(255) DEFAULT NULL,
   `title` varchar(255) DEFAULT NULL,
   `search_string` varchar(255) DEFAULT NULL,
   `url` varchar(255) DEFAULT NULL,
   `hash_url` varchar(255) DEFAULT NULL,
   `scale` varchar(10) DEFAULT NULL,
   `brand` varchar(255) DEFAULT NULL,
   `price` varchar(45) DEFAULT NULL,
   `market_name` tinyint(4) DEFAULT NULL,
   `cyti` varchar(75) DEFAULT NULL,
   `country` varchar(75) DEFAULT NULL,
   `available` varchar(45) DEFAULT NULL,
   `art` varchar(45) DEFAULT NULL,
   `alt_art` varchar(45) DEFAULT NULL,
   `date_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
   `date_update` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `type_model` tinyint(4) DEFAULT NULL,
   PRIMARY KEY (`idlinks`),
   UNIQUE KEY `unique_fx` (`url`,`market_name`),
   KEY `name_fx` (`title`),
   KEY `brand_fx` (`brand`),
   KEY `market_name_fx` (`market_name`),
   KEY `hash_url_fx` (`hash_url`),
   KEY `price_fx` (`price`),
   KEY `date_create` (`date_create`),
   KEY `fx_art` (`art`),
   KEY `fx_alt_art` (`alt_art`)
 ) ENGINE=InnoDB AUTO_INCREMENT=180592036 DEFAULT CHARSET=utf8


seo_data
Код: 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.
CREATE TABLE `seo_data` (
   `idseo_data` int(11) NOT NULL AUTO_INCREMENT,
   `title` varchar(255) NOT NULL,
   `description` varchar(255) DEFAULT NULL,
   `key_words` varchar(255) DEFAULT NULL,
   `h1` varchar(255) DEFAULT NULL,
   `seo_text` text,
   `img_url` varchar(255) DEFAULT NULL,
   `local_img` varchar(255) DEFAULT NULL,
   `alt_img` varchar(255) DEFAULT NULL,
   `seo_url` varchar(255) NOT NULL,
   `hash_item` varchar(255) NOT NULL,
   `delete` int(1) DEFAULT '0',
   `added_in_sitemap` tinyint(4) DEFAULT NULL,
   `add_turbo` tinyint(1) DEFAULT NULL,
   `date_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `date_update` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `url_links` varchar(255) DEFAULT NULL,
   `scale` varchar(10) DEFAULT NULL,
   `brand` varchar(45) DEFAULT NULL,
   `art` varchar(45) DEFAULT NULL,
   PRIMARY KEY (`idseo_data`),
   UNIQUE KEY `fx_unique` (`hash_item`),
   KEY `fx_url` (`seo_url`),
   KEY `fx_hash` (`hash_item`),
   KEY `fx_delete` (`delete`),
   KEY `fx_local_img` (`local_img`)
 ) ENGINE=InnoDB AUTO_INCREMENT=477895 DEFAULT CHARSET=utf8


markets
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `markets` (
   `idmarkets` int(11) NOT NULL AUTO_INCREMENT,
   `title` varchar(255) DEFAULT NULL,
   `url` varchar(255) DEFAULT NULL,
   `sh_script` varchar(255) DEFAULT NULL,
   `key_restart` varchar(255) DEFAULT NULL,
   `date_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (`idmarkets`),
   KEY `fx_markets_id` (`idmarkets`)
 ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024523
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick-name
Таблица seo_data - 400-450 тыс. записей
hash_item
Данные из неё не используются, используется для фильтрации лишнего

Значит, сразу переписывайте как
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT `t1`.`idlinks`, `t1`.`market_name`, `t1`.`img`, `t1`.`title`, 
       `t1`.`url`, `t1`.`hash_url`, `t1`.`scale`, `t1`.`brand`, 
       `t1`.`price`, `t1`.`cyti`, `t1`.`available`, `t1`.`date_create`, 
       `t2`.`idmarkets`, `t2`.`title` AS `name`, `t2`.`url` AS `path` 
FROM `links` `t1` 
  LEFT JOIN `markets` `t2` ON t2.idmarkets= t1.market_name 
WHERE `t1`.`price` BETWEEN 0 AND 1000000)
  AND EXISTS ( SELECT NULL
               FROM `seo_data` `t3`
               WHERE t3.hash_item= t1.hash_url )
ORDER BY CAST(t1.price AS UNSIGNED) 
LIMIT 15
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024748
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё бы неплохо колонку price перевести в числа .. ну и все же Explain к старому и новому запросу глянуть.
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024758
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

explain нового запроса выглядит так
1 PRIMARY t1 range hash_url_fx,price_fx hash_url_fx 768 194239 Using index condition; Using where; Using filesort
1 PRIMARY t2 eq_ref PRIMARY,fx_markets_id PRIMARY 4 links.t1.market_name 1 Using where
1 PRIMARY t3 eq_ref fx_unique,fx_hash fx_unique 767 links.t1.hash_url 1 Using index

но быстрее не стало
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024777
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то подобное и ожидал. BETWEEN по текстовому полю .. круто конечно, но 450тыщ записей .. ожидаемо.

пока не переведете price в число, думаю лучше не будет.
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024779
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109
BETWEEN по текстовому полю
Хуже... оно будет конвертировано в число. С неприятными для корректности результата эффектами...
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024782
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109
что-то подобное и ожидал. BETWEEN по текстовому полю .. круто конечно, но 450тыщ записей .. ожидаемо.

пока не переведете price в число, думаю лучше не будет.

Тогда нужен еще совет, дело в том, что прайс бывает с копейками.
Я вижу три варианта
1) просто отбрасывать копейки
2) перевести во float
3) переводить цену в копейки и хранить в копейках
Что посоветуете?
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024785
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преобразовать из VARCHAR в DECIMAL. Скажем, DECIMAL(11,2).
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024788
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

можно и точнее и толще (в смысле больше разрядов в 64 бита)
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024798
Nick-name
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109
Akina,

можно и точнее и толще (в смысле больше разрядов в 64 бита)

В смысле в DECIMAL или в копейки?
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024830
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109 , можно. 64 бита - это либо DECIMAL(18,0), либо DECIMAL(17, 8).
...
Рейтинг: 0 / 0
mysql Нужна помощь с оптимизацией запроса
    #40024864
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
64 бита - это либо DECIMAL(18,0), либо DECIMAL(17, 8).
Это при условии заполнения всех разрядов, что практически невероятно для денежных сумм.
Но это и не важно, в данной задаче нет какого-то специального смысла заполнить именно 64 бита.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql Нужна помощь с оптимизацией запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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