当前位置:网站首页>MySQL index hit level analysis

MySQL index hit level analysis

2022-07-07 17:39:00 Ugly beyond the 38th parallel

The article citations

Mysql Index hit level

The result value is from good to bad :

  1. system/const, system stay mysql8 There seems to be no more . Generally, the unique result of primary key query will be const.
  2. eq_ref: similar ref, The difference is that the index used is the only index , For each index key value , Only one record in the table matches , Simply speaking , It is used in multi table connection primary key perhaps unique key As a condition of Association
  3. ref: The lookup criteria column uses an index and is not primary key and unique. Actually , It means that although index is used , But the value of the index column is not unique , Repeat . In this way, even if the index is used to quickly find the first data , Still can't stop , To scan a small area near the target value . But the advantage of it is that it doesn't need to scan the whole table , Because the index is ordered , Even if there are duplicate values , It's also scanning in a very small area .
  4. range: Index scan with range , be relative to index Full scan table , He has limits , So it's better than index
  5. index: Another form of full table scanning , But his scanning method is in the order of index
  6. all: Full table scan

preparation

Create a teacher list

CREATE TABLE teacher ( 
	id INT ( 5 ), 
	NAME VARCHAR ( 20 ), 
	card_id INT ( 5 ) 
);

Create a teacher card information table

CREATE TABLE teacher_card ( 
	id INT ( 5 ), 
	remark VARCHAR ( 20 ) 
);

Insert teacher information

insert into teacher values(1, ' Zhang San ', 1);
insert into teacher values(2, ' Li Si ', 2);
insert into teacher values(3, ' Wang Wu ', 3);

Insert teacher card information

insert into teacher_card values(1, ' Teacher Zhang's card ');
insert into teacher_card values(2, ' Miss Li's card ');
insert into teacher_card values(3, ' Miss Wang's card ');

const Type testing

Add the primary key index before the test

alter table teacher add  constraint pk_teacher_id primary key(id);

The derived table has only one main query of data ; The derived table queries only one piece of data through the primary key , Then use this data to make the main query .

EXPLAIN select *  from teacher where id=1

Get the results of the implementation plan :

+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | teacher | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
  1. Only one piece of data can be found SQL, be used for primary key or unique The index of ( Other index types do not belong to ).
  2. When there is only one piece of data in the primary key query , The type is const

eq_ref Type testing

to teacher_card Add primary key

alter table teacher_card add constraint pk_teacher_card_id primary key(id);

Analysis of teacher Table to index unique queries

explain select t.card_id from teacher t, teacher_card tc where t.card_id = tc.id;
explain select t.card_id from teacher t left join teacher_card tc on t.card_id = tc.id;

Get the results of the implementation plan

+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref                            | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------------+------+----------+-------------+
|  1 | SIMPLE      | t     | NULL       | ALL    | NULL          | NULL    | NULL    | NULL                           |    3 |   100.00 | NULL        |
|  1 | SIMPLE      | tc    | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | mysql_ref_index_test.t.card_id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------------------------+------+----------+-------------+

Uniqueness index , The table index is associated with the primary key of another surface , Each data between the two tables should correspond one by one ( Each one should correspond one by one , One cannot correspond to multiple , There must be no correspondence ), The queried data is unique in the table , There can be no repetition .

ref Type testing

Non unique linear index , The data returned from the query of each index key is 0 Or more .

to teacher Tabular name Add an index to the field

alter table teacher add index index_teacher_name (name);
  • according to name = Zhang San found two pieces of data
  • according to name The value directly queried by the index is ref type .
sqlexplain select * from teacher where name = ' Zhang San ';

Implementation plan results :

+----+-------------+---------+------------+------+--------------------+--------------------+---------+-------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys      | key                | key_len | ref   | rows | filtered | Extra |
+----+-------------+---------+------------+------+--------------------+--------------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | teacher | NULL       | ref  | index_teacher_name | index_teacher_name | 83      | const |    1 |   100.00 | NULL  |
+----+-------------+---------+------------+------+--------------------+--------------------+---------+-------+------+----------+-------+

range Type testing

  • Check the specified range line ,where After that is a range query (between、in、>、)
  • see range Index of type

in The situation of

explain select * from teacher t where t.id in (1, 2);

Implementation plan results

+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t     | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

between The situation of

explain select * from teacher where id between 1 and 2;

Implementation plan results

+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | teacher | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

Comparison

explain select * from teacher where id < 3;

Implementation plan results

+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | teacher | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

Range query the specified index , Its index type is range:

index Type testing

  1. Query all data in the index .
  2. Query all the data in the index , among name It's index.
  3. Go straight to the index , There's no need to go back
explain select name from teacher;

Implementation plan

+----+-------------+---------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key                | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | teacher | NULL       | index | NULL          | index_teacher_name | 83      | NULL |    3 |   100.00 | Using index |
+----+-------------+---------+------------+-------+---------------+--------------------+---------+------+------+----------+-------------+

all Type testing

  1. Query all the data in the table , Or query according to fields that are not indexes .
  2. That is to go through the whole table scanning , Can't go to the index .
EXPLAIN select * from teacher;

Implementation plan results

+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | teacher | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |   100.00 | NULL  |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+

type Type summary :

  1. system/const: The result is just one piece of data .
  2. eq_ref: There are many results , But every data is unique .
  3. ref: There are many results , But the data queried can be multiple , And the data can be repeated .
  4. range: Search the index fields for range queries .
原网站

版权声明
本文为[Ugly beyond the 38th parallel]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071524121948.html