Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долго длится SELECT / 20 сообщений из 20, страница 1 из 1
04.09.2020, 13:34
    #39995623
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
Очень долго выполняется простой запрос, около 10 секунд
SELECT * FROM `products` WHERE `vendor`='SNJ5440J' LIMIT 1

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
--
-- Структура таблицы `products`
--

CREATE TABLE `products` (
  `id` int(11) NOT NULL,
  `vendor` text DEFAULT NULL,
  `manufacturer` text DEFAULT NULL,
  `options` text NOT NULL,
  `price` text NOT NULL,
  `time` text NOT NULL,
  `type` text NOT NULL,
  `img` text NOT NULL,
  `href` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


--
-- Индексы таблицы `cyfronsemi`
--
ALTER TABLE `products` ADD KEY `id` (`id`);



Добавил индекс: ALTER TABLE `products` ADD FULLTEXT KEY `vendor` (`vendor`);

Но ничего не изменилось, таблица большая 5743836 записей, 639.3 МБ, как увеличить быстродействие?
Профилирование: Sending Data 9.4 s
...
Рейтинг: 0 / 0
04.09.2020, 13:46
    #39995632
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,

а почему вы решили, что fulltext индекс поможет для поиска на точное совпадение? Создайте btree.
...
Рейтинг: 0 / 0
04.09.2020, 13:56
    #39995645
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,
не стоит использовать тип text где ни попадя
...
Рейтинг: 0 / 0
04.09.2020, 13:59
    #39995648
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
Melkij
commeta,

Создайте btree.
Подскажите как его создать?, в phpmyadmin только понотекстовый активен.
...
Рейтинг: 0 / 0
04.09.2020, 15:35
    #39995697
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
Поменял на varchar, добавил beetree, и все ожило!
...
Рейтинг: 0 / 0
04.09.2020, 18:06
    #39995751
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta
Поменял на varchar, добавил beetree, и все ожило!

Время запроса сократилось с 10 до 2 секунд, а как еще ускорить?
...
Рейтинг: 0 / 0
04.09.2020, 20:56
    #39995787
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta
как еще ускорить?
Показывайте план запроса
...
Рейтинг: 0 / 0
04.09.2020, 23:09
    #39995841
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
miksoft,

Код: 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.
36.
CREATE TABLE `products` (
  `id` int(11) NOT NULL,
  `vendor` varchar(255) DEFAULT NULL,
  `manufacturer` varchar(255) DEFAULT NULL,
  `options` varchar(255) NOT NULL,
  `price` varchar(32) NOT NULL,
  `time` varchar(32) NOT NULL,
  `type` varchar(255) NOT NULL,
  `img` varchar(255) NOT NULL,
  `href` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


ALTER TABLE `products`
  ADD KEY `id` (`id`),
  ADD KEY `vendor` (`vendor`),
  ADD KEY `manufacturer` (`manufacturer`),
  ADD KEY `type` (`type`);


mysql> SELECT * FROM `products` WHERE `vendor`='PIC12E674P04I' LIMIT 1;
+---------+---------------+--------------+---------+-------+------+------+-----+------+
| id      | vendor        | manufacturer | options | price | time | type | img | href |
+---------+---------------+--------------+---------+-------+------+------+-----+------+
| 2582951 | PIC12E674P04I |              |         |       |      |      |     |      |
+---------+---------------+--------------+---------+-------+------+------+-----+------+
1 row in set (3.07 sec)


mysql> EXPLAIN SELECT * FROM `products` WHERE `vendor`='PIC12E674P04I' LIMIT 1;
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | products   | NULL       | ALL  | vendor        | NULL | NULL    | NULL | 5763259 |    10.00 | Using where |
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.00 sec)




Это?
...
Рейтинг: 0 / 0
04.09.2020, 23:19
    #39995842
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> SHOW WARNINGS;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `productsdb`.`products`.`id` AS `id`,`productsdb`.`products`.`vendor` AS `vendor`,`productsdb`.`products`.`manufacturer` AS `manufacturer`,`productsdb`.`products`.`options` AS `options`,`productsdb`.`products`.`price` AS `price`,`productsdb`.`products`.`time` AS `time`,`productsdb`.`products`.`type` AS `type`,`productsdb`.`products`.`img` AS `img`,`productsdb`.`products`.`href` AS `href` from `productsdb`.`products` where (`productsdb`.`products`.`vendor` = 'PIC12E674P04I') limit 1 |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
05.09.2020, 13:30
    #39995891
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,

Сколько выдаст этот запрос:
Код: sql
1.
SELECT COUNT(*) FROM `products` WHERE `vendor`='PIC12E674P04I'

?
...
Рейтинг: 0 / 0
05.09.2020, 19:25
    #39995934
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
miksoft
commeta,
Сколько выдаст этот запрос:
?
3
...
Рейтинг: 0 / 0
06.09.2020, 00:39
    #39995967
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,

Попробуйте ANALYZE TABLE products
После этого замерьте время выполнения запроса и еще раз проверьте план.
...
Рейтинг: 0 / 0
06.09.2020, 03:43
    #39995970
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
miksoft
Попробуйте ANALYZE TABLE products
После этого замерьте время выполнения запроса и еще раз проверьте план.


Код: 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.
mysql> analyze table products;
+----------------------------+---------+----------+----------+
| Table                      | Op      | Msg_type | Msg_text |
+----------------------------+---------+----------+----------+
| productsnnodb.products     | analyze | status   | OK       |
+----------------------------+---------+----------+----------+
1 row in set (0.09 sec)


mysql> SELECT * FROM `products` WHERE `vendor`='T140D107K030AS' LIMIT 1;
+---------+----------------+--------------+---------+-------+------+------+-----+------+
| id      | vendor         | manufacturer | options | price | time | type | img | href |
+---------+----------------+--------------+---------+-------+------+------+-----+------+
| 4740952 | T140D107K030AS |              |         |       | 1    |      |     |      |
+---------+----------------+--------------+---------+-------+------+------+-----+------+
1 row in set (6.10 sec)


mysql> EXPLAIN SELECT * FROM `products` WHERE `vendor`='T140D107K030AS' LIMIT 1;
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | products   | NULL       | ALL  | vendor        | NULL | NULL    | NULL | 5763259 |    10.00 | Using where |
+----+-------------+------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.00 sec)



Ничего не меняется, на всякий случай:
продакшн сервер Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz X4, 8G RAM, крутятся стандартный LAMP.
Код: powershell
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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
cat /etc/mysql/mysql.conf.d/mysqld.cnf 

[mysqld_safe]
log-error=/var/log/mysql.log
socket		= /var/run/mysqld/mysqld.sock
nice		= 0

[mysqld]
collation-server = utf8_general_ci
character-set-server = utf8
local-infile=0
innodb_file_per_table = 1
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
lc-messages-dir	= /usr/share/mysql
skip-external-locking

bind-address		= 127.0.0.1

key_buffer_size		= 256M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8

myisam-recover-options  = BACKUP
max_connections        = 162

innodb_buffer_pool_size = 3G
innodb_buffer_pool_instances = 3
innodb_flush_method = O_DIRECT

query_cache_type        = 1
query_cache_limit	= 8M
query_cache_size        = 32M

tmp_table_size          = 32M
max_heap_table_size     = 32M
table_open_cache        = 3000

log_error = /var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log


expire_logs_days	= 10
max_binlog_size   = 100M
bind-address = 127.0.0.1

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G
long-query-time = 5
...
Рейтинг: 0 / 0
06.09.2020, 12:46
    #39995993
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,

Очень странно.
Тогда так:
Код: sql
1.
ANALYZE TABLE products UPDATE HISTOGRAM ON vendor



Какая у вас точная версия MySQL?

И что будет, если индекс в запросе указать явно:
Код: sql
1.
SELECT * FROM `products` FORCE INDEX (vendor) WHERE `vendor`='T140D107K030AS'
...
Рейтинг: 0 / 0
06.09.2020, 17:41
    #39996010
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
miksoft,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mysql> ANALYZE TABLE `products` UPDATE HISTOGRAM ON `vendor`;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE HISTOGRAM ON `vendor`' at line 1


mysql> SELECT * FROM `products` FORCE INDEX (vendor) WHERE `vendor`='T140D107K030AS';
+---------+----------------+--------------+---------+-------+------+------+-----+------+
| id      | vendor         | manufacturer | options | price | time | type | img | href |
+---------+----------------+--------------+---------+-------+------+------+-----+------+
| 4740952 | T140D107K030AS |              |         |       | 1    |      |     |      |
+---------+----------------+--------------+---------+-------+------+------+-----+------+
1 row in set (9.47 sec)



Код: powershell
1.
2.
3.
4.
mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 965461
Server version: 5.7.31-0ubuntu0.16.04.1-log (Ubuntu)
...
Рейтинг: 0 / 0
07.09.2020, 05:21
    #39996061
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta
Время запроса сократилось с 10 до 2 секунд, а как еще ускорить?

Нормализировать схему бд.
...
Рейтинг: 0 / 0
07.09.2020, 05:23
    #39996062
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta,
а что если длину индекса ограничить каким-нибудь вменяемым значением, например, 15
...
Рейтинг: 0 / 0
07.09.2020, 14:28
    #39996214
commeta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
crutchmaster

Нормализировать схему бд.


paver
commeta,
а что если длину индекса ограничить каким-нибудь вменяемым значением, например, 15


Я не волшебник, я только учусь, подскажите пожалуйста на примере, или дайте ссылку на мануал.
...
Рейтинг: 0 / 0
08.09.2020, 04:55
    #39996388
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta
Я не волшебник, я только учусь, подскажите пожалуйста на примере, или дайте ссылку на мануал.

https://habr.com/ru/post/254773/
Прочитайте любой учебник по теории релиационных бд или загуглите "нормализация отношений бд". Это, наверное, единственное в программировании, что формализовано теоретически.
Если коротко - заменить vendor на vendor_id, добавить таблицу vendor из id и vendor. Искать вендоров по id.
...
Рейтинг: 0 / 0
08.09.2020, 05:41
    #39996392
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долго длится SELECT
commeta

paver
commeta,
а что если длину индекса ограничить каким-нибудь вменяемым значением, например, 15

Я не волшебник, я только учусь, подскажите пожалуйста на примере, или дайте ссылку на мануал.

Код: sql
1.
ADD KEY `vendor` (`vendor`(15))


Но по-любому лучше начать со схемы БД
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долго длится SELECT / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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