ИНДЕКС ИСПОЛЬЗОВАНИЯ в ПРОСМОТРАХ - PullRequest
0 голосов
/ 11 июня 2018

У меня такой запрос:

SELECT * 
  FROM view_name 
  WHERE column1 = something AND column2 = somethingelse

В базовой таблице есть индексы как для column1, так и для column2, но MySQL использует неверный индекс.Как заставить его использовать правильный индекс.Примерно так:

SELECT * 
  FROM view_name USE INDEX (table_name.column2) 
  WHERE column1 = something AND column2 = somethingelse

Редактировать: Кто-то просил об этом:

SHOW CREATE VIEW view1
CREATE ALGORITHM=UNDEFINED DEFINER=`x`@`localhost` SQL SECURITY DEFINER VIEW `view1` AS select `table1`.`id` AS `identifier`,`table1`.`col1` AS `column1`,`table1`.`col2` AS `column2` from `table1`

SHOW CREATE TABLE table1
CREATE TABLE `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` varchar(100) NOT NULL,
  `col2` varchar(100) NOT NULL,
  `col3` varchar(100) NOT NULL,
  `col4` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `col1` (`col1`),
  KEY `col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Редактировать: Более подробное объяснение:

Если я сделаю это:

SELECT * FROM table1 WHERE col1 = x AND col2 = y

MySQL выбирает индекс для col1, и я получаю низкую производительность.

Если я делаю это:

SELECT * FROM table1 USE INDEX (col2) WHERE col1 = x AND col2 = y

MySQL использует индекс для col2, и я получаю отличную производительность.

Как мне сделать то же самое, но на виде?Примерно так:

SELECT * FROM view1 USE INDEX (column2) WHERE column1 = x AND column2 = y

Как мне сказать MySQL, какой индекс использовать при выполнении запроса к представлению?

Редактировать: Я только что нашел это:

Представления не имеют индексов, поэтому подсказки к индексам не применяются.Использование индексных подсказок при выборе из вида не допускается.

https://dev.mysql.com/doc/refman/5.7/en/view-restrictions.html

Так что, возможно, то, что я хочу, не возможно.

1 Ответ

0 голосов
/ 11 июня 2018

Базовая таблица имеет индексы как для column1, так и для column2 ...

Что вы подразумеваете под этим?Чтобы этот запрос был быстрым, вам нужны не два индекса SEPARATE для каждого столбца, а комбинированный индекс.Попробуйте добавить индекс followinfg:

create index ix1 on table_name (column1, column2);

Без этого MySQL может попытаться использовать любой из менее оптимальных индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...