查看“行构造器表达式优化”的源代码
←
行构造器表达式优化
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
行构造器允许同时比较多个值。例如,下面这两个语句在语义上是等价的: <pre>SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;</pre> 此外,优化器会以相同的方式处理这两个表达式。 如果行构造器的列没有覆盖索引的前缀,优化器可能不太可能使用可用的索引。考虑下面这个表,它在(c1, c2, c3)上有一个主键: <pre>CREATE TABLE t1 ( c1 INT, c2 INT, c3 INT, c4 CHAR(100), PRIMARY KEY(c1,c2,c3) );</pre> 在这个查询中,WHERE子句使用了索引中的所有列。然而,行构造器本身没有覆盖索引前缀,因此优化器只使用了c1(key_len=4,c1的长度): <pre>mysql> EXPLAIN SELECT * FROM t1 WHERE c1=1 AND (c2,c3) > (1,1)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 3 filtered: 100.00 Extra: Using where</pre> 在这种情况下,使用等效的非构造器表达式重写行构造器表达式可能会导致更完整的索引使用。对于给定的查询,行构造器和等效的非构造器表达式如下: <pre>(c2,c3) > (1,1) c2 > 1 OR ((c2 = 1) AND (c3 > 1))</pre> 将查询重写为使用非构造器表达式会导致优化器使用索引中的所有三列(key_len=12): <pre>mysql> EXPLAIN SELECT * FROM t1 WHERE c1 = 1 AND (c2 > 1 OR ((c2 = 1) AND (c3 > 1)))\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: range possible_keys: PRIMARY key: PRIMARY key_len: 12 ref: NULL rows: 3 filtered: 100.00 Extra: Using where</pre> 因此,为了获得更好的结果,避免在行构造器和AND/OR表达式中混合使用。使用其中之一即可。 在某些情况下,优化器可以将区间访问方法应用于具有行构造器参数的IN()表达式。
返回至“
行构造器表达式优化
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
基础知识
正则表达式
Markdown
分布式
项目管理
系统集成项目管理基础知识
云原生
Docker
云原生安全
云原生词汇表
十二因素应用
Kubernetes
音频处理
音频合成
Edge-tts
CMS系统
Docsify
VuePress
Mediawiki
自动生成
Marp
CI/CD
GitLab
设计
颜色
平面设计
AI
数字人
操作系统
GNU/Linux
数据库
Mysql
工具
链入页面
相关更改
特殊页面
页面信息