首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >嵌套查询的SQL速度和优化

嵌套查询的SQL速度和优化
EN

Stack Overflow用户
提问于 2018-06-10 19:18:34
回答 2查看 129关注 0票数 1

考虑使用表模式来存储颜色和十六进制代码

代码语言:javascript
复制
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;

现在我必须查询以提取所有的红色

代码语言:javascript
复制
SELECT * FROM tbl_master_colors 
WHERE color_name LIKE "red%"
ORDER BY color_g DESC, color_b ASC, color_r DESC

现在我有了这个查询的2个变体

代码语言:javascript
复制
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%"

问题:上述两种选择查询变体中,哪一种是最快的?为什么?如果可能,请按合理的顺序排列这三个。

考虑:数据集,使其具有9 x 10^6个数据条目,并在10^4的范围内输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-11 16:42:24

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-06-11 06:28:36

第一个是最好的。如果你不能用color_name的索引来修改你的表,我建议你创建一个主色为int的字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50783127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档