1什么是索引:
简单的说索引就是一个指针,用来标记数据库中的数据,从而提高数据的访问效率
索引分文聚簇索引和非聚簇索引:
聚簇索引就是按照数据库中存储数据的物理顺序来保存标记的一种方式,一张表只可以创建一种聚簇索引,因为表中数据的物理结构是固定的。飞聚簇索引的意思与之相反
创建索引的sql:
create index indexName on tableName(columnName)括号中的columnName值可以有很多个
修改表结构添加简单的索引
alter table tableName add index indexName(columnName)
创建唯一索引sql:
create unique index indexName on tableName(columnName)
添加唯一索引
alter table tableName add unique indexName;
创建全文索引sql
create fulltext indexName on tableName(columnName)
添加全文索引sql:
alter table tableName add fulltext(columnName)
添加索引是为了增加检索数据的效率,但是索引也需要合理使用,避免不必要的系统开销
2.mysql中事务的几个特性
原子性:事务的操作是从始至终,要么全部操作完成,要么全部失败
一致性:凡是没有提交的事务,数据库的状态是不会改变的
持久性:就是将数据写入到数据库并一直保存
隔离性:一个事务在对数据修改未提交之前对其他的事务是不可见的
mysql的隔离级别:
read uncommit(未提交读):事务对数据库的修改在未提交之前对其他的事务是可见的,这种隔离级别会造成脏读
read commit(提交读):事务对数据库的修改在未提交之前是对其他的事务不可见的,解决了脏读的问题,也被称为不可重复读,是许多数据库的默认隔离级别
repeatable read(可重复读):mysql的默认隔离级别,这里的可重复读指的是对于一个事务而言,对于一个事务,重复的进行几次的数据查询所得到的数据都是一样的
serializable(可串行化):强制的将事务变为串行执行的序列,并且对每一行数据加锁,解决了幻读问题。
幻读:就是在一个事物进行数据的查询或者修改时,另外一个事务对数据进行了插入操作,导致前一个事物在执行操作之前没有意识到数据的改变,但是在操作时候却出现了数据冲突的现象
mysql常用的存储引擎:
innodb:默认存储引擎,支持事务、行级锁和数据库的恢复,是基于聚簇索引的存储引擎
myisam:不支持事务和行级锁,支持的是表锁,对于那些需要频繁的select的表和突发状况数据恢复问题不大的表适用
memory:这个引擎是将数据保存在内存中,因此断电的情况下会丢失数据,也不能修改数据,可以快速的访问数据
并不建议在一个系统中混合的使用多种不同的存储引擎,这样会带来想不到的bug和问题,大多数情况下只用innodb存储引擎
死锁:
两个或者多个事务在在同一资源上互相占用,并请求对方释放资源的情况。
innodb解决死锁的方式是:将持有最少行级的事务进行回滚。
事务:
简单来说事务就是用来维护数据的一致性的,在同一个事务中进行的操纵,要么同时成功,要么同时失败。
MySQL索引原理:使用了b_tree或者是b+bree的数据结构
b-tree的主要特征:
(1)叶子节点是不包含任何信息的
(2)若是一颗m阶的b_tree,那么一个节点的孩子个数最少有两个
(3)该节点包含的数据个数范围在该节点的孩子个数之间,就是n>=ceil(m/2)-1 n <=m-1
(4)该节点的中的数据是按照升序排列的
(5)innodb存储引擎将节点的大小设置为存储中页的大小,这样每次读取节点就会读取到大量的数据。
innodb的存储引擎是b+bree的索引结构;
b+tree与b_tree的区别就是:
b+bree的非叶子节点都是存储的索引的键值,不包含value值(就是该索引对应的数据),所有的数据都是在同一层的叶子节点上,按照key键值的大小排列的。
使用b+bree的原因就是,在btree结构上,若是对应的键值key所对应的value值太大,那么该节点所能存储的信息就会减少,树的深度就会变深导致查询效率的降低。
MyISAM 和innodb的索引结构都是b+tree的索引结构