当前位置:网站首页>Two minutes, talk about some wrong understandings of MySQL index
Two minutes, talk about some wrong understandings of MySQL index
2022-07-07 22:52:00 【Yes' level training strategy】
Hello , I am a yes.
Today, let's talk about MySQL InnoDB Some easily misunderstood points of the index .
Don't talk much , Direct departure !
You may not use the index you think you will use
In order that the story can develop smoothly , Let's start with a watch , DDL as follows :

Now I want to execute this statement SELECT * FROM yes.t1 where f3 = 11;
Which index do you think is used ?
Many students may feel that although there is idx_f2_f3 This joint index , But the query criteria are f3, No, f2, Does not conform to the leftmost matching principle , Therefore, it is obvious that only full table scanning can be performed .
Let's come. explain once , have a look :
You can see the result ,key yes idx_f2_f3 , So this query uses idx_f2_f3 This index !
Someone here may not understand , How can joint indexing be used if it does not conform to the leftmost indexing principle ?
from explain As a result , Do use the union index , But it's type yes index, therefore It's not the kind of index you think , It is equal to the full scan of the joint index to obtain the results .
It's ok if you don't understand now , Listen to the following explanation .
What exactly is using an index ?
We all know InnoDB It is based on clustering index to build data , Without creating other secondary indexes , You must and can only use cluster index to query data , Because the data is only on this index , Then you don't need this index to find data. What do you use ?
If you build other secondary indexes , Then you may not need cluster index to find data , Instead, only the upper secondary index can directly get the desired data ( This is the example of the above query ).
in summary , you are here InnoDB Find any data , Can only use index .
Then why do some people say that they don't follow the index on weekdays , After walking, the whole table is scanned ?
We all know the default InnoDB The index structure of is B+ Trees , This tree has a feature , Its leaf nodes are connected by linked lists .
So as long as we find primary key The leftmost leaf node , Then traverse the scan in right order , You can get all the records of this form , This scanning method is called full table scanning .

Tips: : I don't know MySQL Is the location of the leftmost leaf node recorded or the leftmost leaf node found according to the root node , Anyway, it means that , It does not affect our understanding of full table scanning .
Then what is index ?

Look at the red query route , It can use the fast search ability of the tree to locate the page where the data is located , Such a query can count as an index .
Then push back from the primary key index to the secondary index , It's the same thing . It can use the characteristics of secondary index tree to find data , Is to use the index .
But if you can't use the fast search of the secondary index tree , Is there such a thing as full table scanning , The operation of directly scanning all leaf nodes of the secondary index ?
yes , we have , This is our example above , I'll move down the screenshot of the execution result :

This query MySQL Full scan secondary index idx_f2_f3 To directly return the required data .
The reason is that the secondary index already contains all the data required by the query :f1、f2、f3, So you can scan the secondary index directly .
You can see explain Of type=index, That is, full scan secondary index .
This is also called using the index .
At this time, we use f2 As a query condition , This conforms to the leftmost matching principle , Let's see explain What's the difference? :

You can see that it is still used idx_f2_f3 , It's just type become ref , This ref It shows that you can quickly query the results when matching with constants .
This is also called using the index .
Okay , Let's sum up what it means to use an index :
- Use the primary key index to quickly find
- Fast search with secondary index
- Full scan the secondary index to find
The above three kinds are what we usually call using indexes , Then the full scan of the primary key index is what we call the full table scan ( Equivalent to not using an index , But we know that it actually uses the primary key index, right ?).
thus , I think you should already know , What exactly is using an index .
Little doubt
About MySQL Some understanding of the index is over , But look at the above example , Some students may be a little confused :
Since they all need full scanning , Why scan the secondary index , Instead of the primary key index ?
Because the primary key index stores all the data , Including transactions related to data rows ID、 Rollback pointer, etc .
The secondary index does not contain these , It only has primary key value and index column value .
Therefore, the overhead of directly reading the secondary index will be smaller , therefore When the index can overwrite the return value , Generally, the secondary index will be selected to find .
For example, I add a field to the table above :f4.

Now let's execute SELECT * FROM yes.t1 where f3 = 11;:

You can see , At this time, the secondary index is not used , Instead, the whole table is scanned directly .
The reason is that the secondary index cannot overwrite the return value , Because there are more f4 Field of .
If used idx_f2_f3 This index , Want to get f4 Value , You also need to find the primary key in the primary key index , Then we can get f4 Value , In this way, the efficiency of returning the table is low .
Of course, the result is not certain , Sometimes it is possible MySQL The statistics are wrong , Wrong index . because MySQL The execution plan is selected based on cost , Yes I/O Cost and CPU cost , Use whichever index has a low cost .
therefore , In the next article, I will analyze how the cost is calculated !
Last
I believe you have fully understood what is the use of the index ?
Okay , That's all for today's article , Wait for my next article MySQL Cost analysis !
You can click on the business card below , Pay attention to me ~
I am a yes, From a little to a billion, I'll see you next .
边栏推荐
- Unity local coordinates and world coordinates
- Px4 autonomous flight
- Nx10.0 installation tutorial
- Remember an experience of using selectmany
- 0-5VAC转4-20mA交流电流隔离变送器/转换模块
- php 记录完整对接腾讯云直播以及im直播群聊 所遇到的坑
- UWA Q & a collection
- 行测-图形推理-2-黑白格类
- Get the exact offset of the element
- VTOL in Px4_ att_ Control source code analysis [supplement]
猜你喜欢

Blender exchange group, welcome to the water group ~

Robot autonomous exploration series papers environment code

PHP method of obtaining image information

行测-图形推理-7-相异图形类

行测-图形推理-9-线条问题类

Nx10.0 installation tutorial

新版代挂网站PHP源码+去除授权/支持燃鹅代抽

UWA Q & a collection
![[environment] pycharm sets the tool to convert QRC into py file](/img/4f/d1c811dea23e3695a8b6d04b938bb5.jpg)
[environment] pycharm sets the tool to convert QRC into py file

Explain in detail the communication mode between arm A7 and risc-v e907 on Quanzhi v853
随机推荐
Revit secondary development - cut view
Force deduction - question 561 - array splitting I - step by step parsing
Understand the autograd package in pytorch
Px4 autonomous flight
Pyqt GUI interface and logic separation
Revit secondary development - link file collision detection
Redis集群安装
Loki, the "open source star picking program", realizes the efficient management of harbor logs
Firefox browser installation impression notes clipping
行测-图形推理-6-相似图形类
Leetcode206. Reverse linked list
如何选择合适的自动化测试工具?
Attitude estimation (complementary filtering)
OpenGL job coordinate system
Redis cluster installation
Debezium系列之:mysql墓碑事件
Blender exchange group, welcome to the water group ~
Leetcode94. Middle order traversal of binary trees
Class implementation of linear stack and linear queue (another binary tree pointer version)
PHP method of obtaining image information