【问题标题】:SQL speed and optimization for nested query嵌套查询的 SQL 速度和优化
【发布时间】:2018-11-19 20:12:36
【问题描述】:

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

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。 p>

【问题讨论】:

    标签: mysql algorithm sorting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请将其视为一个大问题的示例。问题是“上述 2 个选择查询变体中哪个最快,为什么?”
      猜你喜欢
      • 2022-11-11
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      相关资源
      最近更新 更多