索引和引擎入门(小白篇)

版权声明:禁止转载 https://blog.csdn.net/qq_36505948/article/details/82189353

一、基本认知

1-----什么是索引?

如果将数据库中的一张表比喻为一本新华字典,那么索引就是这本又厚又重的字典的目录! 使用索引是为了提高搜索引用的效率,节约时间!同样以一本字典为例,一般情况我们查找一个目标的方法是两种:一种是穷举,逐页地查找自己想要的,这种情况下字典有1千万条记录,那么你的最大搜索就是一千万,搜索的效率会随着字典的厚度而降低; 另外一种是根据目录(或拼音或部首)查找,先找到目标所在页数,然后我们去翻页!

2-----什么是引擎?
如果将数据库中的一张表比喻为一本新华字典,那么引擎就是这边又厚又重的管理员,或者说是你指定要帮你执行查询字典的人,帮你新增目标进入字典的人!那么人根据类型不同可以分为小孩,年轻人,青年人,中年人等,不同年龄阶段的人能力的强弱不同,不于不同职业的人,能力偏重也各有不同!对于引擎来说,同样也如是,有的引擎侧重搜索,有的引擎侧重对数据库修改,有的引擎侧重事务,有的引擎丝毫不在意事务;不同类型的引擎能力各有不同,效率也各不相同;

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、入门

1-----索引类型?

常用的索引类型有:主键索引,普通索引,聚合索引(也即是多字段组合所以),唯一索引,全文索引。 在日常开发中,唯一索引和全文索引使用得比较少,我们主要接触的是前三种索引;


主键索引:顾名思义即是数据库把表的主键字段默认设置为索引,一般在建表就已经存在了!

普通索引:针对普通非主键字段建立索引,一般该字段被作为高频查询条件在很多场景中使用!

聚合索引:多个字段一起作为索引

唯一索引:唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复,一般通过约束UNIQUE添加

全文索引:索引(查找)的是目标内容的拆分集合,其流程是读取数据到内存,调用分词算法对目标进行分词最后进行索引,从而实现提高关键字搜索功能的效率!可以简单理解为高效的模糊查询(Like)。全文索引一般是在大量数据库中才会有,对于一般数据库而言,数据量越小,关联性越低,拆分的词可能匹配度越低,冒用全文索引可能找不到目标!  大白话理解就是将所在列的词打散与排列组合,放在内存中,然后再从这些被打散的词里面找到符合自己要求的,再索引到原本的记录,因此数据的相关性会与数据量相关!

普通词频查询:
SELECT * FROM tableNname WHERE MATCH(index_name) AGAINST(‘xxx,xxx’); 
高频词的查询:
SELECT * FROM tableNname WHERE MATCH(index_name) AGAINST (‘高频词’ IN BOOLEAN MODE)

2-----操作索引?

查看某张表的所有索引:show  index  from  表名; 

增加某张表的普通索引:alter   表名  add index  索引名(加索引的列)  

删除某张表的某个索引:drop index  索引名  on  表名

添加某张表的全文索引:alter talbe tablename add fulltext( column); 

3-----操作引擎?

MyISAM:不支持事务,读写互相阻塞,并发性低,以读为主,同时只会缓存索引key,不会缓存数据。尽量顺序操作以保证不阻塞(表锁定,读写单一且不可重复),其全表扫描操作效率比较高

InnoDB:支持事务四大特性,行级别锁定,可以缓存索引也可以缓存数据,表数据和主键关联后以平衡树形式存放,因此尽可能将主键设置小以拥有更多空间量!对高并发和数据一致性场景有较好适应,适用于频繁改动数据的场景!

NDBCluster:分布式存储引擎,可与mysql不在同一台主机上, 搜索方式单一,内存需求量巨大,每次查询数据量小(少用)

3-----测试案例?

步骤1:创建一张测试用的表,在该表里面维护10万到20万的数据以进行测试

##使用该表字段信息
CREATE TABLE `batchinfo`(
    `id` BIGINT(20)PRIMARY KEY NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(20)DEFAULT NULL,
    `password` VARCHAR(50)DEFAULT NULL,
    `mobile`   VARCHAR(11)DEFAULT NULL,
    `email`    VARCHAR(50)DEFAULT NULL
) ENGINE = MyISAM DEFAULT CHARSET = utf8;
================================================================================================

解析:建表时候使用的存储引擎是MyISAM ,此引擎没有事物等数据库高级应用,在按顺序操作和可读性效率比较高,方便我们快速插入测试数据,待插入完数据把存储引擎改为InnoDB~

步骤2:往测试表里面插入测试用的数据(此处利用存储过程)

CREATE PROCEDURE batchinfo_addData()
BEGIN
    DECLARE num INT;
    SET num = 1;
    WHILE num <= 100000 DO
        INSERT INTO batchinfo(username, password,mobile,email) VALUES (num, PASSWORD(num),num,num);
        SET num = num + 1;
    END WHILE;
END;
call batchinfo_addData();

解析:存储过程适用于格式化的数据库操作

步骤3:修改存储引擎,为表添加事务机制

alter table batchinfo engine=InnoDB;

步骤4:此时表中存在至少10万条数据,那么可以尝试测试索引与不索引之间的区别

主键索引:
select id,username,password,mobile,email from batchinfo where id=9998
统计用时:0.0xx s

无索引情况下执行组合查询:
select id,username,password from andy_user where username='99999' and password = '1111'
统计用时:0.0xx s

添加组合索引:
ALTER TABLE `batchinfo` ADD INDEX index_union_name_password(username,password)
再次执行SQL,统计用时:0.0xx s

删除索引,以方便下一次测试:
drop index index_union_name_password on btahinfo;
无索引查询:
select id,username,password,mobile,email from batchinfo where username='9998'
统计用时:0.0xx s

添加普通索引:
ALTER TABLE `andy_user` ADD INDEX index_name(username);
执行SQL,统计用时:0.00xx s

 解析:根据每次有无执行索引的耗时来看,执行索引的效率要数倍高于普通无索引查询

4-----常用数据库结构查询?

查询数据库的表结构:desc  tablename;

查询执行计划的信息:desc  执行的SQL  ;

查询执行计划的信息:explain 执行的SQL ;

解析:执行计划可以查看本次查询检索的行数,使用的索引等信息

猜你喜欢

转载自blog.csdn.net/qq_36505948/article/details/82189353
今日推荐