当存在一个10000000条记录的数据库表时,查询员工编号为998877的员工select * from EMP where empno=998877;
耗时大约在5S,在实际公网服务器项目中,面对高并发访问就很可能死机。
当创建索引后,alter table EMP add index(empno);
查询效率就会大幅度提高,减少上述场景发生的可能性。
MySQL 中的Page都是 16KB ,使用 prev 和 next 构成双向链表。链表的特点是增删快,查询修改慢,所以优化查询的效率是必须的。
如果有主键的存在, MySQL 会默认按照主键给我们的数据进行排序,数据是有序且彼此关联的,插入数据时排序的目的就是为了方便引入页目录从而优化查询的效率 。
目录是一种“空间换时间的做法” ,提高了查找的效率。
MySQL 中每一页的大小只有 16KB ,单个Page大小固定,但是随着数据量不断增大,16KB 不可能存下所有的数据,那么必定会有多个页来存储数据。
给Page页也带上目录,使用一个目录项来指向某一页,而这个目录项存放的就是将要**指向的页中存放的最小数据的键值。**通过比较找到要访问的那个Page,进而通过指针找到下一个Page 。
目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是下级Page的最小键值和普通页的地址映射。
查找的时候,自顶向下找,只需要加载部分目录页到内存,即可完成算法的整个查找过程,大大减少了IO次数。
多个page构成B+树,全部的数据都在叶子节点,非叶子节点只保存键值和Page指针。B+树中的需要全部load到内存,mysql会按需load。
索引的本质就是通过B+树的数据结构将表中的数据根据用户指定的关键字组织起来,提高查找的效率。
B树节点既有数据又有Page指针,而B+只有叶子节点有数据,其他目录页只有键值和Page指针,B+叶子节点全部相连,而B树不会。
目录页不存储数据可以让一个目录页管理更多的page,使得树更矮,减少IO次数。并且叶子节点相连,更便于进行范围查找。
聚簇索引:用户数据与索引数据在一起索引方案,叫做聚簇索引,例如:InnoDB 存储引擎。
非聚簇索引: 索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址,叫做非聚簇索引,例如: MyISAM 存储引擎。
-- 在创建表的时候,直接在字段名后指定 primary key
create table user1(id int primary key, name varchar(30));
-- 在创建表的最后,指定某列或某几列为主键索引
create table user2(id int, name varchar(30), primary key(id));
create table user3(id int, name varchar(30));
-- 创建表以后再添加主键
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));
-- 创建表以后再添加唯一键
create table user6(id int primary key, name varchar(30));
alter table user6 add unique(name);
唯一索引的特点:
create table user8(id int primary key,
name varchar(20),
email varchar(30),
index(name) --在表的定义最后,指定某列为索引
);
create table user9(id int primary key, name varchar(20), email varchar(30));
alter table user9 add index(name); --创建完表以后指定某列为普通索引
create table user10(id int primary key, name varchar(20), email varchar(30));
-- 创建一个索引名为 idx_name 的索引
create index idx_name on user10(name);
普通索引的特点:
当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL全文索引的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。如果对中文进行全文检索,可以使用sphinx。
alter table 表名 drop primary key;
alter table 表名 drop index 索引名;
drop index 索引名 on 表名
事务的提交方式常见的有两种:
查看事务提交方式
show variables like 'autocommit';
用 SET 来改变 MySQL 的自动提交模式
SET AUTOCOMMIT=0; #SET AUTOCOMMIT=0 禁止自动提交 #SET AUTOCOMMIT=1 开启自动提交
start transaction/begin;
——开始一个事务
rollback;
——回滚事务,默认回滚到最开始
savepoint XXX;
——再任意位置创建一个回滚点
rollback to XXX;
——回滚到回滚点所在的位置
start transaction/begin;
——开始一个事务
commit
——提交事务。
MySQL服务可能会同时被多个客户端进程(线程)访问,访问的方式以事务方式进行。在数据库中,为了保证事务执行过程中尽量不受干扰,就需要一个重要特征:隔离性。在保证数据安全的情况下,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别。
总结: