当前位置:网站首页>MySQL advanced part 2: the use of indexes

MySQL advanced part 2: the use of indexes

2022-07-05 06:13:00 Dawnlighttt


Use of index

Index is one of the most common and important means of database optimization , Indexing can usually help users solve most of MySQL Performance optimization problem of .

Verifying indexes improves query efficiency

In the table structure we prepared tb_item in , A total of 300 Ten thousand records ;

A. according to ID Inquire about

select * from tb_item where id = 1999\G;

 Insert picture description here

Fast query , near 0s , The main reason is that id Primary key , There is an index ;

 Insert picture description here

2). according to title Make a precise inquiry

select * from tb_item where title = 'iphoneX  Move 3G 32G941'\G; 

 Insert picture description here

see SQL Statement execution plan :

Treatment scheme , in the light of title Field , Create index :

create index idx_item_title on tb_item(title);

 Insert picture description here

After the index is created , Check again :

 Insert picture description here

adopt explain , View execution plan , perform SQL The index just created is used

 Insert picture description here

Use of index

Prepare the environment

create table `tb_seller` (
	`sellerid` varchar (100),
	`name` varchar (100),
	`nickname` varchar (50),
	`password` varchar (60),
	`status` varchar (1),
	`address` varchar (100),
	`createtime` datetime,
    primary key(`sellerid`)
)engine=innodb default charset=utf8mb4; 

insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('alibaba',' Alibaba ',' Ali shop ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('baidu',' Baidu Technology Co., Ltd ',' Baidu store ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('huawei',' Huawei Technology Co., Ltd ',' Huawei store ','e10adc3949ba59abbe56e057f20f883e','0',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('itcast',' Chuanzhi podcast Education Technology Co., Ltd ',' Spreading wisdom Podcast ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('itheima',' Black horse programmer ',' Black horse programmer ','e10adc3949ba59abbe56e057f20f883e','0',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('luoji',' Logitech Technology Co., Ltd ',' Logitech shop ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('oppo','OPPO Technology Co., Ltd ','OPPO Official flagship store ','e10adc3949ba59abbe56e057f20f883e','0',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('ourpalm',' Zhangqu Technology Co., Ltd ',' Zhangqu shop ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('qiandu',' QIANDU Technology ',' QianDu store ','e10adc3949ba59abbe56e057f20f883e','2',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('sina',' Sina Technology Co., Ltd ',' Sina's official flagship store ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('xiaomi',' Xiaomi Tech ',' Xiaomi's official flagship store ','e10adc3949ba59abbe56e057f20f883e','1',' Xi'an City ','2088-01-01 12:00:00');
insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('yijia',' IKEA ',' IKEA flagship store ','e10adc3949ba59abbe56e057f20f883e','1',' The Beijing municipal ','2088-01-01 12:00:00');

--  Create a federated index 
create index idx_seller_name_sta_addr on tb_seller(name,status,address);

Avoid index invalidation

1). Full match , Specify specific values for all columns in the index . In this case , The index works , High execution efficiency .

explain select * from tb_seller where name=' Xiaomi Tech ' and status='1' and address=' The Beijing municipal ';

 Insert picture description here

2). The leftmost prefix rule

If you index multiple columns , Follow the leftmost prefix rule . It means that the query starts from the top left of the index , And don't skip columns in the index .( Imagine climbing stairs )

Match the leftmost prefix rule , Go to the index :

 Insert picture description here

Illegal leftmost prefix rule , Index failure :

 Insert picture description here

If the law of the left is the best , But there was a jump in a column , Only the leftmost column index takes effect :

 Insert picture description here

3). Range query right column , Index cannot be used . Fields after range query criteria , Index failure

 Insert picture description here

According to the first two fields name , status Queries are indexed , But the last condition address No index is used .

4). Do not operate on index columns , Index will fail .
 Insert picture description here

5). String without single quotes , Cause index invalidation .

 Insert picture description here

because , The query is , No single quotes for Strings ,MySQL The query optimizer for , It will automatically perform type conversion , Cause index invalidation .

6). Try to use overlay index , avoid select *

Try to use overlay index ( Queries that only access the index ( Index column contains query column completely )), Reduce select * .

 Insert picture description here

If the query column , Out of index columns , It also reduces performance .( Index column has no password, So you need to go back to the table to query )

 Insert picture description here

TIP : 
	
using index : When using overlay index, it will appear 

using where: In the case of search using index , You need to go back to the table to query the required data 

using index condition: Search uses index , But you need to return the table to query the data 

using index ; using where: Search uses index , But all the data needed can be found in the index column , So you don't need to go back to the table to query the data 

7). use or The conditions of separation , If or The columns in the previous condition are indexed , And there's no index in the next column , Then the indexes involved will not be used .

Example ,name Fields are index columns , and createtime It's not an index column , In the middle is or Connection is not indexed :

explain select * from tb_seller where name=' Black horse programmer ' or createtime = '2088-01-01 12:00:00'\G;	

 Insert picture description here

8). With % At the beginning Like Fuzzy query , Index failure .

If it's just tail blur matching , The index will not fail . If it's a fuzzy head match , Index failure .

 Insert picture description here

Solution : Solve by overriding the index

 Insert picture description here

9). If MySQL Evaluation uses indexes more slowly than full tables , Index is not used .

 Insert picture description here

Mingming created... Alone address Indexes , however explain View unused indexes , This situation is related to the data in the table , Look at the table data to know ,12 Data ,11 The bar is ’ The Beijing municipal ’, Using index lookup is not as efficient as direct full table scanning , So in the implementation SQL At the time of statement ,MySQL Discard index , And using a full table scan .

10). is NULL , is NOT NULL Sometimes Index failure .

 Insert picture description here

MySQL The bottom layer will automatically judge , If the full table scan is fast , Then directly use the full table to scan , Don't walk index . If most of the index column data in the table is non null , Then use is not null Go when you need to , Use is null Don't leave the index when ( It's not as fast as full table scanning ), Full table scan ; vice versa .

11). in Go to the index , not in Index failure .

 Insert picture description here

12). Single column index and composite index .

Try to use composite indexes , Use less single column indexes .

Create composite index

create index idx_name_sta_address on tb_seller(name, status, address);

 It's like creating three indexes  : 
	name
	name + status
	name + status + address

Create a single column index

create index idx_seller_name on tb_seller(name);
create index idx_seller_status on tb_seller(status);
create index idx_seller_address on tb_seller(address);

When using a single column index , The database will choose an optimal index ( The most recognizable index ) To use , Not all indexes will be used .

Check index usage

show status like 'Handler_read%';	 --  View current session index usage 

show global status like 'Handler_read%';	--  View global index usage 

 Insert picture description here

Handler_read_first: The number of times the first item in the index has been read . If it's higher , Indicates that the server is performing a large number of full index scans ( The lower the value, the better ).

Handler_read_key: If the index is working , This value represents the number of times a row has been read by the index value , If the value is lower , Indicates that the performance improvement of index is not high , Because indexes are not often used ( The higher the value, the better ).

Handler_read_next : Number of requests to read next line in key order . If you use range constraints or if you perform index scans to query index columns , The value increases .

Handler_read_prev: Number of requests to read the previous line in key order . This reading method is mainly used to optimize ORDER BY ... DESC.

Handler_read_rnd : The number of requests to read a line according to a fixed location . If you are executing a large number of queries and need to sort the results, the value is high . You may be using a lot of needs MySQL Scan the entire table for queries or your connection is not properly keyed . This is a higher value , It means that the operation efficiency is low , An index should be established to remedy .

Handler_read_rnd_next: Number of requests to read the next line in the data file . If you're doing a lot of scanning , The value is higher . Usually it means that your table index is not correct or the query written does not use the index .

原网站

版权声明
本文为[Dawnlighttt]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140620215574.html