索引会可以提高查询速度,但是会增加大量的IO。数据库服务端本质是一个进程,所以是在内存中,而数据库文件本质是保存在内存当中,对数据操作都是在内存中进行的。
B+ 树的非叶子结点只存关键字不存数据,单个页可以存储更多的关键字, I/O 读取次数相对就减少,查找效率稳定
MySQL与磁盘交互的基本单位是16KB,叫做page,文件数据是以page为单位保存在磁盘当中,所以进行数据交互需要IO,为提升效率要减少IO的使用。
IO交互使用的是page,不用page查5条数据要调用5次IO,用page只要调用一次IO,之后要查的数据直接在内存中进行,采用的是B+树。
单个page,内部数据会按照主键进行排序
单个Page内创建页内目录
多个Page
Page之上创建页目录
只需在查询语句开头增加 EXPLAIN 这个关键字
三种创建方式
//创建表的时候,直接在列名后指定 primary key create table user1( id int primary key, name varchar(30) ); //创建表的最后,指定某列或某几列为主键索引 create table user2( id int, name varchar(30), primary key(id) ); //创建表以后再添加主键 alter table user3 add primary key(id);
//表定义时,在某列后直接指定unique唯一属性。 create table user4( id int primary key, name varchar(30) unique ); //创建表时,在表的后面指定某列或某几列为unique create table user5( id int primary key, name varchar(30), unique(name) ); //创建表以后再添加唯一键 alter table user6 add unique(name);
//在表的定义最后,指定某列为索引 create table user8(id int primary key, name varchar(20), email varchar(30), index(name) ); //创建完表以后指定某列为普通索引 alter table user9 add index(name); //创建一个索引名为 idx_name 的索引 create index idx_name on user10(name);
存储引擎必须是MyISAM,使用match(列1) against (关键字)
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT,//内容很大 FULLTEXT (title,body) )engine=MyISAM; select * from articles where match(title,body) against ('database');//查询哪些文章中包含database关键字
show index from 表名\G;//加\G是方便看 show keys from 表名\G; desc 表名;
alter table 表名 drop primary key;//删除主键索引 alter table 表名 drop index 索引名;//删除非主键索引