发现MySQL的explain还是很有迷惑性的。
看下面两个sql的explain,(i,j)是tt的主键
mysql> explain select * from tt where i between 3 and 5 and j = 4\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tt
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: NULL
rows: 8
Extra: Using where; Using index
1 row in set (0.00 sec)
mysql> explain select * from tt where i > 2 and i < 6 and j = 4\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tt
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: NULL
rows: 8
Extra: Using where; Using index
1 row in set (0.00 sec)
看上去如果使用了between,那么MySQL可以用的索引的两列。但仔细的研究了一下,发现实际并不是这样。between 3 and 5可以写为(i>3 or i=3) and (i<5 or i=5),是这两个等号使用了两列,而大于和小于的判断仍然是index扫描,只用了一列。
再看另一个
mysql> explain select * from tt where i in (3,4,5) and j=4\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tt
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: NULL
rows: 3
Extra: Using where; Using index
1 row in set (0.00 sec)
这个才是真正用了两列,可以看到这里估计的行数是3,而刚才两个是8。用 show status 可以看得更清楚一些:
mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 0 |
| Handler_read_key | 0 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 0 |
+-----------------------+-------+
6 rows in set (0.00 sec)
mysql> select * from tt where i in (3,4,5) and j=4;
+---+---+
| i | j |
+---+---+
| 3 | 4 |
+---+---+
1 row in set (0.00 sec)
mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 0 |
| Handler_read_key | 4 |
| Handler_read_next | 1 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 0 |
+-----------------------+-------+
6 rows in set (0.00 sec)
mysql> select * from tt where i between 3 and 5 and j = 4;
+---+---+
| i | j |
+---+---+
| 3 | 4 |
+---+---+
1 row in set (0.00 sec)
mysql> show status like 'handler_read%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 0 |
| Handler_read_key | 6 |
| Handler_read_next | 10 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 0 |
| Handler_read_rnd_next | 0 |
+-----------------------+-------+
6 rows in set (0.00 sec)
后一个sql中有9次read_next_key,说明做了索引扫描。
分享到:
相关推荐
(To prevent misunderstanding, you'd better explain the issue to her clearly.) 3. 即使不吃早餐,也不能帮助减肥。(Skipping breakfast won't contribute to weight loss either.) 这些例子说明,在实际...
如“human”(人类)、“native”(本地的、母语者)、“tolerant”(宽容的)、“annoy”(使恼怒)、“pretend”(假装)、“misunderstand”(误解)、“ask for”(请求)、“admit”(承认)、“politely”...
1. **使用EXPLAIN命令:** EXPLAIN可以帮助我们了解SQL查询的执行计划,识别出哪些部分可能导致性能问题。 2. **调整查询逻辑:** 修改查询逻辑以利用索引或者其他数据结构,减少复杂度较高的操作。 3. **利用提示...
在与考官交流的过程中,如果考官没有理解或误解了考生的回答,应当礼貌地要求澄清,并用更清晰的方式进行解释,例如:“Sorry, maybe you misunderstood, could you give me a chance to explain?” 或 “Excuse me,...
通过类比,他们可能会错误地构建出"Please explain me the meaning"(而应是"Please explain the meaning to me")。他们可能遇到"I intend to do"、"I propose to do"和"I want to do"这样的句子,然后构造出"I ...
同时,当自己的回答被误解时,应主动解释,如"Excuse me. I guess I am not making myself clear. May I explain further?"或"May I try to explain myself in another way.",确保信息准确传达。 当得到老师的肯定...
4. 英语词汇的应用:学习和运用诸如 "accusation"、"complain"、"explain" 等词汇。 5. 文化差异:了解西方学校环境中教师与学生、家长之间的沟通方式。 这个课件的目的是让学生在准备中考的过程中,不仅提升语言...
he didn't explain clearlyD. he didn't know their body language答案:D[解析] 根据第四段最后一句“You have to know where a person is from to understand whether they mean 'yes' or 'no'”可知,Tom 不了解...
标准化的沟通模板在医疗行业中尤为重要,因为它可以确保信息的准确传递,减少误解和错误。这里提到了两种常见的沟通工具:CICARE和SBAR。 - **CICARE模型**(Connection, Identify, Care, Ask, Respond, Explain...
5. 确认重要细节:在涉及关键条款如金额、交货条件和日期时,要反复确认以免出现误解。可以使用"Is this what we decided?"来检查合约内容是否与商定一致。如果发现错误,及时提出"I'll have to return this ...
3. "As a matter of fact…" 用来强调事实或纠正误解,表明说话者的真实观点。例如:"As a matter of fact, I have already finished the assignment." 4. "As far as I'm concerned/…" 这个句型用于表达个人观点...
5. **kubectl命令使用**:在第140页,原本提到使用`kubectl explain`检查资源详情,实际上应该是`kubectl describe`,后者能提供更详尽的信息。 6. **配置文件路径**:第146页的Listing 5.14中,路径`/foo`应改为`/...
5. 如果是你的错,承认并解释(explain)你的错误,表明你不应该说那些话或做那些事,表达你的歉意。 6. 不要用电子邮件或者电话(call)道歉,而应该勇敢地面对面道歉。这样更能显示你的诚意。 7. 如果你的朋友...
Well, let me explain. In the journey of life, especially during our college years, friendships are formed, tested, and sometimes challenged. Perseverance plays a crucial role in fostering and ...
这个幽默的对话反映出人们对新事物的理解可能存在误解,并且在面对日常生活中不常见的消费模式时,会产生有趣的交流。 这个故事在小学英语教学中可以作为一个生动的例子,帮助孩子们学习英语词汇、理解句子结构,...
在SQL语句中,如果列名没有明确限定(即没有指定所属的表名),而该列名与其他表的列名相同,DB2可能会误解该列名的指向,从而导致错误。 **SQLCODE:** +204 **SQLSTATE:** 01532 **说明:** 命名的对象未在DB2中...
这通常是一个误解,因为数据库按行存储数据,读取一个或多个字段通常不会显著改变IO量。但如果查询能利用覆盖索引,即仅通过索引获取所需数据,而不必回表获取其他字段,那么选择较少的字段确实能减少IO。 误区4:...