powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долго длится SELECT
20 сообщений из 20, страница 1 из 1
Долго длится SELECT
    #39995623
commeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень долго выполняется простой запрос, около 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
Долго длится SELECT
    #39995632
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
commeta,

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

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

Время запроса сократилось с 10 до 2 секунд, а как еще ускорить?
...
Рейтинг: 0 / 0
Долго длится SELECT
    #39995787
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
commeta
как еще ускорить?
Показывайте план запроса
...
Рейтинг: 0 / 0
Долго длится SELECT
    #39995841
commeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Долго длится SELECT
    #39995842
commeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Долго длится SELECT
    #39995891
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
commeta,

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

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

Попробуйте ANALYZE TABLE products
После этого замерьте время выполнения запроса и еще раз проверьте план.
...
Рейтинг: 0 / 0
Долго длится SELECT
    #39995970
commeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Долго длится SELECT
    #39995993
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
commeta,

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



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

И что будет, если индекс в запросе указать явно:
Код: sql
1.
SELECT * FROM `products` FORCE INDEX (vendor) WHERE `vendor`='T140D107K030AS'
...
Рейтинг: 0 / 0
Долго длится SELECT
    #39996010
commeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Долго длится SELECT
    #39996061
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
commeta
Время запроса сократилось с 10 до 2 секунд, а как еще ускорить?

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

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


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


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

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

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

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

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


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


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