《Linux与数据库》课件5. 索引原理基础.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Linux与数据库》课件5. 索引原理基础.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux与数据库 Linux与数据库课件5. 索引原理基础 Linux 数据库 课件 索引 原理 基础
- 资源描述:
-
1、索引解决的问题索引解决的问题 提高查询速度 对DML语句附加真正行锁,以减少等待创建大表脚本创建大表脚本1delimiter/CREATE PROCEDURE big_table(cnt int)BEGIN DECLARE i INT DEFAULT 1;SET autocommit=0;DROP TABLE IF EXISTS big_table;CREATE TABLE big_table(id1 INT PRIMARY KEY,id2 INT,data VARCHAR(30);WHILE(i=cnt)DO INSERT INTO big_table VALUES(i,i,CONCAT(r
2、ecord,i);SET i=i+1;END WHILE;COMMIT;SET autocommit=1;END;/delimiter;创建大表脚本创建大表脚本2create procedure big_table(cnt int)begin declare i int default 1;set autocommit=0;drop table if exists big_table;create table big_table(id1 bigint primary key,id2 bigint,data char(100);while(i select*from big_table wher
3、e id2=100;+-+-+-+|id1|id2|data|+-+-+-+|100|100|rec 100|+-+-+-+1 row in set(38.34 sec)影响数据查询速度的主要因素影响数据查询速度的主要因素耗费时间的操作 CPU处理 内存处理 读取磁盘次数读取磁盘次数读取磁盘的单位 数据页 读取磁盘的次数=读取的数据页数读取磁盘时间的决定因素 磁盘读取时间=读取的数据页数 每个数据页平均读取时间innodb_page_size设置数据页大小,可以为4kB,8kB,16kB,默认为16kB mysql show variables like innodb_page_size;+-
4、+-+|Variable_name|Value|+-+-+|innodb_page_size|16384|+-+-+给表分配空间的单位给表分配空间的单位-extent For 4KB,8KB,and 16KB pages sizes,the extent size is 1MB For a 32KB page size,the extent size is 2MB For a 64KB page size,the extent size is 4MB创建主键约束后,表内行的存储方式创建主键约束后,表内行的存储方式 叶节点内容 把行按照主键值从小到大排序 存入分到的数据页 分支节点内容 当叶节点
5、数据页超过1个时,会分配1个新页作为分支节点,在其中存储其下层每个数据在其中存储其下层每个数据页页的第一个的第一个主键主键值及此值所在的数据值及此值所在的数据页页页页号。号。若由于数据量增大,导致分支节点数据页又超过一个,则又会在上层产生一个分支节点,这个数据块也是存储下层每个数据这个数据块也是存储下层每个数据页页的第的第1个值及此列值所在的数据块块号。个值及此列值所在的数据块块号。最上层分支节点总保持一个数据块 这个结构称为这个结构称为B树结构树结构 若未创建主键,也没有not null的唯一约束,则MySQL会自动增加一个6字节的自增整型主键列,其值全局共享,即实例内所有表共享。索引分类索
6、引分类(information_schema.innodb_indexes)0=nonunique Secondary Index 1=automatically generated clustered index(GEN_CLUST_INDEX)2=Unique nonclustered Index 3=Primary Index 32=full-text index 64=spatial index 128=secondary index on a virtual generated column.mysql select name,type from innodb_indexes -wh
7、ere table_id in(select table_id from innodb_tables where name like law/emp);+-+-+|name|type|+-+-+|PRIMARY|3|fk_deptno|0|+-+-+2 rows in set(0.01 sec)普通索引叶节点存储内容普通索引叶节点存储内容 排序后的索引列值及其所在记录的主键值 create index idx on dept(dname)普通索引分支节点普通索引分支节点 当叶节点数据块超过一个时,每个叶节点数据块也会保存其前后数据块的块号,而B树索引会在叶节点上层产生一个新的分支节点,在其中存
8、储其下层每个数据块在其中存储其下层每个数据块的第一个索引列值及此列值所在的数据的第一个索引列值及此列值所在的数据页页页页号。号。若由于索引数据量增大,导致分支节点数据块又超过一个,则又会在上层产生一个分支节点,这个数据这个数据页页也是存储下层每个数据也是存储下层每个数据页页的第一个索引列值及此列值所的第一个索引列值及此列值所在的数据在的数据页页页页号。号。B树索引的最上层分支节点总保持一个数据页B树索引树索引 1971年,波音公司,Rudolf Bayer与Ed McCreight B的含义尚无定论,一般认为表示Boeing、Bayer或Balanced创建和删除索引创建和删除索引 标准语法m
9、ysql create index idx_ename on emp(ename);mysql create index idx_com on emp(empno,ename,sal);mysql drop index idx_ename on emp;MySQL扩展语法mysql alter table t add index idx_b(b desc);mysql alter table t drop index idx_b;mysql alter table emp alter index idx_emp_ename invisible;说明:MySQL不支持alter index语句,
10、desc索引及invisible属性为8.0加入约束和索引约束和索引 自动创建索引的约束类型 主键 唯一 外键 索引的命名 主键约束产生的索引名称总为PRIAMRY 唯一和外键约束创建的索引与约束名称相同mysql use information_schemamysql select i.name,t.name -from innodb_indexes i,innodb_tables t -where i.table_id=t.table_id and t.name=law/t;查询索引信息查询索引信息mysql show index from law.c;设置索引的可见性设置索引的可见性my
11、sql alter table t alter index idx_b invisible;mysql alter table t alter index idx_b visible;Query OK,0 rows affected(0.06 sec)说明:主键索引不能设置为不可见。索引可见性由8.0版本引入使用索引的情形使用索引的情形 单表查询单表查询 where index_col=val(=,between)表连接的连接字段表连接的连接字段 其他其他 min(),max()order by distinct group by 查询只涉及复合索引中的列查询只涉及复合索引中的列explain
12、-查看执行计划查看执行计划 EXPLAIN works with SELECT,DELETE,INSERT,REPLACE,and UPDATE statements.EXPLAIN returns a row of information for each table used in the SELECT statement.It lists the tables in the output in the order that MySQL would read them while processing the statement.只查看预估执行计划 若from子句有子查询,可能会实际执行一
13、部分任务 MySQL resolves all joins using a nested-loop join method.简单的执行计划简单的执行计划mysql explain select ename from emp where empno=7369;+-+-+-+-+-+-+-+-+-+-+-+-+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+-+-+-+-+-+-+-+-+-+-+-+-+|1|SIMPLE|emp|NULL|const|PRIMARY|
14、PRIMARY|2|const|1|100.00|NULL|+-+-+-+-+-+-+-+-+-+-+-+-+1 row in set,1 warning(0.00 sec)mysql explain select ename from emp where empno 7800;+-+-+-+-+-+-+-+-+-+-+-+-+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+-+-+-+-+-+-+-+-+-+-+-+-+|1|SIMPLE|emp|NULL|ran
15、ge|PRIMARY|PRIMARY|2|NULL|5|100.00|Using where|+-+-+-+-+-+-+-+-+-+-+-+-+1 row in set,1 warning(0.00 sec)简单的执行计划简单的执行计划mysql alter table emp drop primary key;Query OK,12 rows affected(0.23 sec)Records:12 Duplicates:0 Warnings:0mysql explain select ename from emp where empno=7369;+-+-+-+-+-+-+-+-+-+-+
16、-+-+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+-+-+-+-+-+-+-+-+-+-+-+-+|1|SIMPLE|emp|NULL|ALL|NULL|NULL|NULL|NULL|12|10.00|Using where|+-+-+-+-+-+-+-+-+-+-+-+-+1 row in set,1 warning(0.00 sec)mysql explain select ename from emp where empno 7800;+-+-+-+-+
17、-+-+-+-+-+-+-+-+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+-+-+-+-+-+-+-+-+-+-+-+-+|1|SIMPLE|emp|NULL|ALL|NULL|NULL|NULL|NULL|12|33.33|Using where|+-+-+-+-+-+-+-+-+-+-+-+-+1 row in set,1 warning(0.00 sec)执行计划中的执行计划中的select_type SIMPLE:未使用子查询,并等 PRIMARY:使
18、用子查询时,最外层的主查询 DERIVED:from子句中的子查询 select*from(select deptno,sum(sal)from emp group by deptno)a SUBQUERY:非相关子查询,如where、select子句 select ename,sal from emp where sal=(select max(sal)from emp)select(select max(sal)from emp)sal_t,ename from emp DEPENDENT SUBQUERY:相关子查询 type(access_type,json格式格式)ALL 全表扫描,
19、效率最低,所以用大写 index perform a full index scan,this may be chosen in combination of using a covering index system used with tables that have exactly one row.This means thetable can be treated as a constant select*from(select 1)a const At most one row is matched for the table,for example,when there is a
20、filter on a single value of the primary key or a unique index select*from emp where empno=7369 type(continue)eq_ref The table is the right-hand table in a join where the condition on the table is on a primary key or not null unique index The eq_ref access type is a specialized case of the ref access
21、 type where only one row can be returned per lookup select*from emp e straight_join dept d on d.deptno=e.deptno ref The table is filtered by a nonunique secondary index select*from emp where deptno=10 index_merge select*from emp where deptno=10 or empno=7369 range The range access type is used when
22、an index is used to look up several values either in sequence or in groups.It is used both for explicit ranges like ID BETWEEN 1 AND 10,for IN clauses,or where several conditions on the same column are separated by ORExtra Using index a covering index is used Using index condition select*from emp wh
23、ere deptno in(10,20)Using where When a WHERE clause is applied to the table without using an index.This may be an indication that the indexes on the table are not optimal.select*from emp where ename=SMITH Using index for group-by Using join buffer(Block Nested Loop)This means that a join is made whe
24、re no index can be used,so the join buffer is used instead.Tables with this message are candidates to have an index added.Using join buffer(Batched Key Access)Using MRR Using filesort Using temporary An internal temporary table is used to store the result of a subquery,for sorting,or for grouping.Fo
25、r sorting and grouping,the use of an internal temporary table can sometimes be avoided by adding an index or rewriting the query.只访问索引的情况只访问索引的情况 查询的列都包含在索引中 执行计划的Extra为using index(主键索引除外)mysql alter table emp add index(sal,ename);Query OK,0 rows affected(0.12 sec)Records:0 Duplicates:0 Warnings:0my
展开阅读全文