1.使用mysql索引都有哪些原则?索引什么数据结构?
B+tree和B tree什么区别?
- 对于查询频率高的字段创建索引
- 对排序、分组、联合查询频率高的字段创建索引
- 索引的数目不宜太多
原因: a、每创建一个索引都会占用相应的物理控件;
b、过多的索引会导致insert,update、delete语句的执行效率降低
- 若在实际中,需要将多个列设置索引时,可以采用多列索引
如:某个表(假设表名为Student),存在多个字段(StudentNo, StudentName, Sex, Address, Phone, BirthDate),
其中需要71 StudentNo, StudentName 字段进行查询,对 Sex字段进行分组,对BirthDate字段逹行排序,此时可以创建多列索引 index index_najne (StudentNo, StudentName, Sex, BirthDate) ;
#index_najne 为索引名在上面的语句中只创建了一个索引,但是对4个字段都赋予了豪引的功能。 创建多列索引,需要遵循BTree类型,即第一列使用时,才启用索引。
在上面的创建语句中,只有mysql语句在使用到StudentNo字段时,索引才会被启 用。
如: select * from Student wheie StudentNo = 1000; #使用到了 StudentNo 字段,索引被启用。
以使用explain检测索引是否被启用如:explain select * from Student where StudentNo = 1000;
- 选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存 在同名现象,从而降低查询速度
- 尽量使用数据量少的索引
如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR (100)类型的 字段进行全文检索 需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多
- 尽量使用前缀来索引
如果索引字段的值很长,最好使用催的前缀来索引。例如,TEXT和BLOG类型的字段,
进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提 高检索速度。
- 删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。
数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作 的影响B+ tree树索引,B tree,散列
2.Mysql有哪些存储引擎?请详细列举其区别?
- InnoDB:事务型存储引擎,并且有较高的并发读取频率
- MEMORY: 存储引擎,存放在内存中,数据量小,速度快
- Merge:
- ARCHIVE:归档,有很好的压缩机制
3.设计高并发系统数据库层面该如何设计?数据库锁有哪些类型?如何实现?
- 分库分表
同样量的数据平均存储在不同数据库相同表(或不同表)中,减轻单表压力,
如果还是很大,就可以每个库在分多张表,根据hash取值或者其他逻辑判断将 数据存储在哪张表中
- 读写分离
数据库原本就有主从数据库之分,[查询]在从服务器,[増删改]在主服务器
- 归档和操作表区分
建一张归档表,将历史数据放入,需要操作的表数据单独存储
- 索引之类的创建
对于数据量很大,百万级别以上的单表,如果増删改操作不频繁的话,可以创建[bitMap]索引,速度要快得多
- 数据库锁
- 共享锁:要等第一个人操作完,释放锁,才能操作
- 更新锁:解决死锁,别人可以读,但不能操作
- 排他锁:读写都被禁用
- 意向锁(xlock):对表中部分数据加锁,查询时,可以跳过
- 计划锁:操作时,别的表连接不了这张表
4.数据库事务有哪些
- 原子性:所有操作要么全部成功,要么全部失败
- —致性:例如转账,一个事务执行前和执行后必须一致
- 隔离性:防止脏读,重复读问题
- 持久性:永久性提交数据
5.Sql中哪些情况可能不会走索引?
- 查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引
- 单键值的b树索引列上存在null值,导致COUNTS不能走索引。索引列存在空值
- 索引列上有函数运算,导致不走索引
- 隐式类型转换导致不走索引。
- 表的数据小或者需要选择大部分数据,不走索引
- !=或者◊(不等于),可能导致不走索引
- 表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式,
- 使用like, in等,可能导致不走素引
6. MyISM 和 InnoDB区别
- MyISM
采用表级锁,对Myism表读不会阻塞读,会阻塞同表写,对Myism写则会阻塞读 和写,即一个线程获得1个表的写锁后,只有持有锁的线程可以对表更新操作,其他线 程的读和写都会等待。 - InnoDB
采用行级锁,支持事务,例如只对a列加索引,如果update … where a=l and b=2其实也会锁整个表,select使用共享锁,update insert delete采用排它锁, commit会把锁职消,当然select by id for update也可以制定排它锁。
7.DB的特性和隔离级别?
4大特性:原子性,一致性,隔离性,持久性
隔离级别:
- 读提交:写事务禁止读
- 读未提交:写事务允许读
- 可重复读:写事务禁止读事务,读禁止
- 序列化:全部禁止
详细说明:
读提交:
1个事务开始写则全部禁止其他事务访问该行;
读未提交:
1个事务开始写则不允许其他事务同时写,但可以读;
可重复读读:
事务会禁止写事务,写事物则禁止其他任何事务;
序列化:
性能最低,全部禁止,串行执行。
MYSQL默认的是可重复读