当前位置:网站首页>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 .
边栏推荐
- Remember aximp once Use of exe tool
- Redis official ORM framework is more elegant than redistemplate
- Variables and constants
- [problem] pytorch installation
- Gazebo import the mapping model created by blender
- C # realizes the communication between Modbus protocol and PLC
- LeetCode203. Remove linked list elements
- Vs custom template - take the custom class template as an example
- Cannot find module 'xxx' or its corresponding type declaration
- Select sort (illustration +c code)
猜你喜欢
苹果在iOS 16中通过'虚拟卡'安全功能进一步进军金融领域
Line test - graphic reasoning - 3 - symmetric graphic class
新版代挂网站PHP源码+去除授权/支持燃鹅代抽
Nx10.0 installation tutorial
LeetCode206. Reverse linked list [double pointer and recursion]
微服务远程Debug,Nocalhost + Rainbond微服务开发第二弹
行測-圖形推理-4-字母類
ASEMI整流桥KBPC1510的型号数字代表什么
vite Unrestricted file system access to
行测-图形推理-5-一笔画类
随机推荐
软件测评中心▏自动化测试有哪些基本流程和注意事项?
Get the exact offset of the element
The free styling service of Dyson's official direct store is now open for appointment. Pioneer Technology interprets the styling concept of hair care and helps consumers unlock diversified and shiny s
行测-图形推理-6-相似图形类
Redis cluster installation
ASP. Net core introduction V
Unity development --- the mouse controls the camera to move, rotate and zoom
Debezium series: MySQL tombstone event
新版代挂网站PHP源码+去除授权/支持燃鹅代抽
Yarn cannot view the historical task log of yarn after enabling ACL user authentication. Solution
OpeGL personal notes - lights
ASP.NET Core入门五
Debezium系列之:引入对 LATERAL 运算符的支持
[environment] pycharm sets the tool to convert QRC into py file
Debezium series: support the use of variables in the Kill Command
Add get disabled for RC form
Microservice Remote debug, nocalhost + rainbond microservice Development second Bomb
Visual design form QT designer design gui single form program
微服務遠程Debug,Nocalhost + Rainbond微服務開發第二彈
Typeorm automatically generates entity classes