1.使用mysql索引有哪些原则?索引什么数据结构?B+tree和Btree什么区别?
1).使用索引的原则
a.对于查询频率高的字段创建索引;
b.对排序、分组、联合查询频率高的字段创建索引;
c.索引的数目不宜太多(每一个索引都会占用相应的物理控件,过多的索引会导致增删改语句执行效率低)
d.尽量选择唯一性索引,可以更快速的通过索引来确定某条记录。
e.尽量使用数据量少的索引,如果索引的值很长会影响查询速度。
f.不要选择命中率低的索引。比如 status的值只有0 1 ,创建一个索引就没有意义。
2).B+tree和Btree的区别
a.在Btree中,越靠近跟节点的记录查找时间越快,只要找到关键字即可确定记录的存在,而在B+tree中每个记录的查询时间基本上都是一样的,都需要从跟节点走到子节点,而且在子节点中还要再比较关键字。从这个角度看Btree要比B+tree好,而在实际应用中却是B+tree性能好。因为B+tree的非叶子节点不存放实际的数据,这样每个节点可容纳的元素个数比Btree多,这样带来的好处是减少磁盘访问次数。
3).Btree 和 Hash索引的区别
a.Hash仅支持=、>、>=、<、<=、between。BTree可以支持like模糊查询(不能以%开头),使用%开头则不会使用索引。
c.联合索引中,Hash索引不能利用部分索引键查询。对于联合索引中的多个列,Hash是要么全部使用,要么全部不使用。
e.因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询。
f.Hash每次都要全表扫描。
g.当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高。
2.mysq有哪些存储引擎啊?都有啥区别?
1).存储引擎 1.MyISAM、2.InnoDB、3.Memory、4.Merge、5.BLACKHOLE、6.CSV、7.Archive、8.Federate。
a.InnoDB:MySQL5.5.5以后默认的存储引擎,支持事务、行级锁定和外键、灾难恢复性好
b.MyISAM:MyISAM 拥有较高的插入、查询速度,但不支持事务、使用表级锁,并发性差。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎。
c.Memory:提供内存表,也不支持事务和外键。显著提高访问数据的速度,可用于缓存会频繁访问的、可以重构的数据、计算结果、统计值、中间结果。使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈。只支持固定大小的行。Varchar类型的字段会存储为固定长度的Char类型,浪费空间。
2).MySQL存储引擎MyISAM与InnoDB如何选择:
a.InnoDB支持事务而MyINSAM不支持。
c.MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
d.InnoDB支持外键,MyISAM不支持
e.从MySQL5.5.5以后,InnoDB是默认引擎
总之,现在一般都是选用InnoDB了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。
a.MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
b.MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
3.Mysql数据库事务及特性
1).事务就是一个程序执行单元,里边的操作要么全部执行,要么全部都不执行。事务是必须满足4个条件(ACID)
a.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
b.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
c.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
d.持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
2).事务隔离性问题
a.脏读:指一个事务读取到另外一个事务未提交的数据。
b.幻读:指一个事务读取到另外一个事务已提交的数据。
c.不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据。
3).事务的隔离级别
a.未提交读(Read uncommitted):可能脏读、可能幻读、可能不可重复。
b.读已提交(Read committed):可能脏读
c.可重复读(Repeatable read):可能幻读
d.串行化(Serializable ):读写加锁,最高的隔离级别,级别越高,数据越安全,但性能越低。
4).默认是可重复读,实际项目还是使用读已提交级别。
a.在可重复读隔离级别下,存在间隙锁,导致出现死锁的几率比读已提交大的多。
b.在可重复读隔离级别下,条件列未命中索引会锁表!而在读已提交隔离级别下,只锁行。
c.在读已提交隔离级别下,半一致性(semi-consistent)特性增加了update操作的并发性!
4.事务的七种传播级别:
a.REQUIRED:默认的传播级别支持当前事务,如果当前有事务则加入事务,没有则创建一个新的事务。
b.SUPPORTS:支持当前事务,如果当前没有事务,则以非事务方式执行。
c.MANDATORY:支持当前事务,如果当前没有事务,则抛出异常。
d.REQUIRES_NEW:新建事务,如果当前有事务,则挂起。
e.NOT_SUPPORTED:以非事务方式执行,如果当前有事务,则挂起。
f.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
g.NESTED:支持当前事务,如果当前有事务,就在当前事务中嵌套其他事务。如果没有则新建事务。父事务回滚当前事务也会回滚。