Скорость SQL и оптимизация для вложенного запроса - PullRequest
0 голосов
/ 10 июня 2018

Рассмотрим схему таблицы для хранения цветов и шестнадцатеричных кодов

CREATE TABLE `tbl_master_colors` (
  `color_id` int(11) NOT NULL,
  `color_name` varchar(100) NOT NULL,
  `color_hex` varchar(6) NOT NULL,
  `color_hex_hashed` varchar(7) NOT NULL,
  `color_r` int(11) NOT NULL,
  `color_g` int(11) NOT NULL,
  `color_b` int(11) NOT NULL,
  `status` enum('1','2','3') NOT NULL DEFAULT '1',
  `inserted_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_ts` timestamp NULL DEFAULT NULL,
  `deleted_ts` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Теперь мне нужно запросить, чтобы извлечь все красные цвета

SELECT * FROM tbl_master_colors 
WHERE color_name LIKE "red%"
ORDER BY color_g DESC, color_b ASC, color_r DESC

Теперь у меня есть еще 2 варианта этого запроса

SELECT * 
FROM (SELECT * FROM tbl_master_colors 
WHERE color_name LIKE "red%") s
ORDER BY color_g DESC, color_b ASC, color_r DESC;

SELECT * 
FROM (SELECT * FROM tbl_master_colors 
ORDER BY color_g DESC, color_b ASC, color_r DESC) s
WHERE color_name LIKE "red%"

Вопрос: КакойИз 2 приведенных выше вариантов выбора запроса самый быстрый и почему?Если возможно, пожалуйста, расположите все три по порядку с указанием причины.

Рассмотрим: В наборе данных должно быть 9 x 10 ^ 6 записей данных и вывод в диапазоне 10 ^ 4 .

Ответы [ 2 ]

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

Начиная с MySQL 5.7, все эти три оператора имеют одинаковую производительность.Производная таблица (подзапрос в предложении FROM) будет объединена с внешним запросом.(См. https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html).

. Я не думаю, что стандарт SQL гарантирует такой же порядок для последнего запроса, как и для двух других, но MySQL также объединит предложение ORDER с внешним запросом.

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

Первый самый лучший.Если вы не можете изменить свою таблицу с индексом на color_name, я предлагаю сделать поле с основным цветом в int.

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