Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql Нужна помощь с оптимизацией запроса / 18 сообщений из 18, страница 1 из 1
04.12.2020, 10:28
    #40024473
Nick-name
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
Здраствуйте, прошу помощи с оптимизацией запроса. Я не знаю можно ли его с оптимизировать или нет, по этому и обращаюсь к знатокам
Итак сам запрос,
Код: 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
04.12.2020, 10:54
    #40024483
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
Nick-name,

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

А что вы хотели сделать этой строчкой?
...
Рейтинг: 0 / 0
04.12.2020, 11:21
    #40024495
Nick-name
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
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
04.12.2020, 11:27
    #40024498
Nick-name
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
miksoft
Nick-name,

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

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

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

Что вы имеете ввиду?
Результат команды SHOW CREATE TABLE.
...
Рейтинг: 0 / 0
04.12.2020, 11:55
    #40024508
Nick-name
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
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
04.12.2020, 12:13
    #40024523
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
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
04.12.2020, 20:32
    #40024748
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
Ещё бы неплохо колонку price перевести в числа .. ну и все же Explain к старому и новому запросу глянуть.
...
Рейтинг: 0 / 0
04.12.2020, 21:10
    #40024758
Nick-name
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
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
04.12.2020, 22:49
    #40024777
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mysql Нужна помощь с оптимизацией запроса
что-то подобное и ожидал. BETWEEN по текстовому полю .. круто конечно, но 450тыщ записей .. ожидаемо.

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

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

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

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

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

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


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