MySQL优化之索引(二)

1. 索引的引言

本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方

索引:是帮助mysql高效获取数据的数据结构 —摘自mysql官网

首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname=‘张’,如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE name = ‘张’。

一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在name上建立索引,那么mysql只需要扫描一行数据及为我们找到这条name='张’的数据,是不是感觉性能提升了好多咧…

2. 索引的作用

作用: 用来加快数据库查询效率

3. 索引的种类

mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引,全文索引

单列索引:一个索引只包含一个列,一个表可以有多个单列索引.

组合索引:一个组合索引包含两个或两个以上的列。

全文索引: 全文索引的索引类型为FULLTEXT

4. 批量录入数据脚本

查看是否支持自定义函数

mysql> show variables like 'log_bin_trust_function_creators';

在这里插入图片描述

注意:从上面可以发现mysql官方默认不支持自定义函数,如果要定义自定义函数必须先开启自定义函数。

开启允许自定义函数

mysql> set global log_bin_trust_function_creators=1;

在这里插入图片描述


定义生成随机字符串函数

DELIMITER $$  																						--声明MySQL命令以$$为结尾符号
	CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
	BEGIN
 		DECLARE chars_str VARCHAR(100) DEFAULT 				 
 					'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';					
 		DECLARE return_str VARCHAR(255) DEFAULT '';
 		DECLARE i INT DEFAULT 0;
 		WHILE i < n DO
 			SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
 			SET i = i + 1;
 		END WHILE;
 	RETURN return_str;
END $$

调用函数

在这里插入图片描述

定义生成随机数的函数

DELIMITER $$
CREATE FUNCTION rand_num( ) 
RETURNS INT(5)  
BEGIN   
 DECLARE i INT DEFAULT 0;  
 SET i = FLOOR(101+RAND()*10);  
RETURN i;  
 END $$

在这里插入图片描述

调用函数

在这里插入图片描述

创建emp和dept表插入数据存储过程

DELIMITER $$
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))  
BEGIN  
DECLARE i INT DEFAULT 0;   
#set autocommit =0 把autocommit设置成0  
 SET autocommit = 0;    
 REPEAT  
 SET i = i + 1;  
 INSERT INTO t_emp (id,name,age,deptid) VALUES ((START+i) ,rand_string(6),23,rand_num());  
UNTIL i = max_num  
END REPEAT;  
COMMIT;  
END $$

DELIMITER $$
CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))  
BEGIN  
DECLARE i INT DEFAULT 0;   
 SET autocommit = 0;    
 REPEAT  
 SET i = i + 1;  
	INSERT INTO t_dept (id ,name) VALUES ((START+i) ,rand_string(10));  
UNTIL i = max_num  
END REPEAT;  
COMMIT;  
END $$ 

在这里插入图片描述

调用存储过程插入数据

DELIMITER ;
mysql> call insert_dept(100,10);

在这里插入图片描述
在这里插入图片描述

mysql> call insert_emp(100001,500000);

在这里插入图片描述

5. 索引的创建

单列索引-普通索引

alter table  表名 add index 索引名(字段) 			--创建索引
create index 索引名 on 表名(字段)               ---创建索引
create unique index 索引名 on 表名(字段)           ---唯一索引
create index 索引名 on 表名(字段1,字段2)         ---复合索引
drop index name_index on 表名                 ---删除索引
show index from 表名                          --查看索引

单列索引-唯一索引

create unique index 索引名 ON 表名(字段名);

注意:唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值

单列索引-主键索引

注意:主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)主键索引建立的规则是int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是AUTO_INCREMENT自增类型的

复合索引

create index 索引名 on 表名(字段1,字段2)         ---复合索引

注意:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

全文索引

alter table 表名 add FULLTEXT(`字段名`);

强烈注意:MySQL自带的全文索引,只能用于数据库引擎为MyISAM的数据表*,如果是其他数据引擎,则全文索引不会生效。此外,MySQL自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

发布了33 篇原创文章 · 获赞 42 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cx521600/article/details/89677204