赞
踩
目录
(1)关于索引
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
(2)常见索引
(3)案例
- drop database if exists `bit_index`;
- create database if not exists `bit_index` default character set utf8;
- use `bit_index`;
-
- -- 构建一个8000000条记录的数据
- -- 构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解
-
- -- 产生随机字符串
- delimiter $$
- 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 ;
-
-
- -- 产生随机数字
- delimiter $$
- create function rand_num( )
- returns int(5)
- begin
- declare i int default 0;
- set i = floor(10+rand()*500);
- return i;
- end $$
- delimiter ;
-
- -- 创建存储过程,向雇员表添加海量数据
- delimiter $$
- create procedure insert_emp(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 EMP values ((start+i)
- ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
- until i = max_num
- end repeat;
- commit;
- end $$
- delimiter ;
-
- -- 雇员表
- CREATE TABLE `EMP` (
- `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
- `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
- `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
- `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
- `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
- `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
- `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
- `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
- );
-
-
- -- 执行存储过程,添加8000000条记录
- call insert_emp(100001, 8000000);

①查询员工编号为998866的员工
②解决方法,创建索引,创建索引也是需要花费时间的
③换一个员工编号,测试看看查询时间
(1) Mysql与存储
② 磁盘中一个盘片
(3)扇区
②我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。(当然,有一些内存文件系统,如proc , sys 之类,我们不考虑)
③数据库文件,本质其实就是保存在磁盘的盘片当中,就是一个一个的文件
(4)定位扇区
(5)结论
①所谓的IO效率低指的是哪方面效率低?
②你怎么保证,我未来要访问的数据和我当前你的page是同一个?
(1)基本概念
(1)建立测试表
(2)插入多条记录
(3)查看结果
(4)为何IO交互以Page为单位
(5)理解单个Page
②为什么数据库在插入数据时要对其进行排序呢?我们按正常顺序插入数据不是也挺好的吗?
(6)理解多个Page
(7)页目录
(8)单页情况
(9)多页情况
①page页相连
②提升查找page页的效率
1) 可在Page之间,也是需要 MySQL 遍历的,遍历意味着依旧需要进行大量的IO,将下一个Page加载到内存,进行线性检测。这样就显得我们之前的Page内部的目录,有点杯水车薪了。
③其实目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。
(10)小结
不保存任何用户数据,只保存它所管理的所有的page的最小记录ID为什么?
(1)InnoDB 在建立索引结构来管理数据的时候,为何不使用其他数据结构
(2)B树 vs B+树
①B树
②B+树
(3)聚簇索引 VS 非聚簇索引
② MyISAM 这种用户数据与索引数据分离的索引方案,叫做非聚簇索引
③ InnoDB 这种用户数据与索引数据在一起索引方案,叫做聚簇索引
(4)其他索引
①下图就是基于 MyISAM 的 Col2 建立的索引,和主键索引没有差别
②InnoDB 除了主键索引,用户也会建立辅助(普通)索引,我们以上表中的 Col3 建立对应的辅助索引如下图
③小结
(1)创建主键索引
- //法1
- // 在创建表的时候,直接在字段名后指定 primary key
- create table user1(id int primary key, name varchar(30));
-
- //法2
- // 在创建表的最后,指定某列或某几列为主键索引
- create table user2(id int, name varchar(30), primary key(id));
-
- //法3
- create table user3(id int, name varchar(30));
- // 创建表以后再添加主键
- alter table user3 add primary key(id)
主键索引的特点:
- //法1
- // 在表定义时,在某列后直接指定unique唯一属性。
- create table user4(id int primary key, name varchar(30) unique);
-
- //法2
- // 创建表时,在表的后面指定某列或某几列为
- unique create table user5(id int primary key, name varchar(30), unique(name));
-
- //法3
- create table user6(id int primary key, name varchar(30));
- alter table user6 add unique(name);
- //法1
- create table user8(
- id int primary key,
- name varchar(20), email varchar(30),
- index(name) //在表的定义最后,指定某列为索引
- );
-
- //法2
- create table user9(
- id int primary key,
- name varchar(20),
- email varchar(30)
- );
- alter table user9 add index(name); //创建完表以后指定某列为普通索引
-
- //法3
- create table user10(
- id int primary key,
- name varchar(20), email varchar(30)
- );
- //创建一个索引名为 idx_name 的索引
- create index idx_name on user10(name);

(4)全文索引的创建
①创建表并插入数据
②查询有没有database数据
③可以用explain工具看一下,是否使用到索引
④如何使用全文索引
⑤再次使用explain查看
(5)查询索引
(6)删除索引
①第一种方法-删除主键索引: alter table 表名 drop primary key;
②第二种方法-其他索引的删除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的Key_name 字段
③第三种方法: drop index 索引名 on 表名
(7)索引创建原则
(8)如果我的表没有设置主键呢? 查找会不会很慢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。