MYSQL запрос оптимизации выбирается по простому столбцу - PullRequest
2 голосов
/ 19 января 2020

У меня есть запрос типа

SELECT `table1`.* 
  FROM `table1` 
 WHERE `table1`.`table2_id` IN (1,2,6,12,53,666)

, и он работает более 20 секунд

Объяснение выглядит так:

+----+-------------+--------------------------+------------+-------+-------------------------------------------------------------------------------+----------------------------------+---------+------+-------+----------+-----------------------+
| id | select_type | table                    | partitions | type  | possible_keys                                                                 | key                              | key_len | ref  | rows  | filtered | Extra                 |
+----+-------------+--------------------------+------------+-------+-------------------------------------------------------------------------------+----------------------------------+---------+------+-------+----------+-----------------------+
|  1 | SIMPLE      | table1                   | NULL       | range | table2_id                                                                     | table2_id                           | 4       | NULL | 74778 |   100.00 | Using index condition |
+----+-------------+--------------------------+------------+-------+-------------------------------------------------------------------------------+----------------------------------+---------+------+-------+----------+-----------------------+

Таблица выглядит как

CREATE TABLE `table1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `table2_id` int(11) NOT NULL,
  `table3_id` int(11) NOT NULL,
  `field1` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `field2` int(11) NOT NULL DEFAULT '0',
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `field3` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_of_index_id` (`table3_id`),
  KEY `other_name_of_index` (`field2`),
  KEY `table2_id` (`table2_id`)
) ENGINE=InnoDB AUTO_INCREMENT=86623178 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

1 Ответ

0 голосов
/ 19 января 2020

Вы можете использовать индекс для быстрого получения результата. Но индексация займет больше места для генерации и хранения в базе данных. Таким образом, если вы можете использовать сравнение скорости с пробелом, индексирование будет использоваться со следующим оператором SQL.

ALTER TABLE `table1` ADD INDEX(`table2_id`);
...