嵌套查询

时间:2018-06-10 11:18:34

标签: mysql algorithm sorting

考虑用于存储颜色和十六进制的表架构

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 :(得分:1)

从MySQL 5.7开始,所有这三个语句都具有相同的性能。派生表(FROM子句中的子查询)将合并到外部查询中。 (见https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html)。

我认为SQL标准不保证最后一个查询的顺序与其他两个查询相同,但MySQL也会将ORDER子句合并到外部查询中。

答案 1 :(得分:0)

第一个是最好的。 如果您无法使用color_name上的索引修改表,我建议在int。中创建一个主色的字段。