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技术来处理中文。