B树和B+树的区别:
B树的特点:
1.节点排序
2.一个节点可以存多个元素,多个元素之间也排序
B+树的特点:
1.拥有B树的特点
2.叶子节点之间有指针
3.非叶子结点上的元素在叶子节点上都冗余了,也就是叶子节点中存储了所有的元素,并且排好序
mysql使用的是B+树,因为索引是用来加速查询的,而B+树通过对数据
进行排序所以是可以提高查询效率的,然后通过一个节点可以存储多个
元素,从而可以使得B+树的高度不会很高,在mysql中一个inndb页就是
一个B+树节点,一个inndb页默认16kb,所以一般情况下一颗两层的
B+树可以存2000万行左右的数据,然后通过利用B+树叶子节点存储了所
有数据并且进行了排序,并且叶子节点之间有指针,可以很好的支持全
表扫描,范围查找等。
最左前缀原则:
当一个sql利用索引时,一定要提供该索引所对应的字段中最左边的字
段,比如针对a,b,c三个字段建立了一个联合索引,那么在写sql就一
定要提供a字段的条件,这样才能用到联合索引,这是由于在建立a,b,
c三个字段的联合索引时,底层的B+树是按照a,b,c从左往右去比较大
小进行排序的,所以如果想要利用B+树进行快速查询也得符合这个原则。
Redis和mysql怎么保证数据一致性:
延时双删:先删除redis里面的数据,再更新mysql,延迟几百毫秒再删除
redis缓存数据,这样就算在更新mysql前,有其他线程读了mysql,把老
数据读到了redis,那么也会被删除,从而把数据保持一致
索引的基本原理:
索引是用来快速寻找那些具有特定值的记录,一般来说执行查询时遍历整张表。
索引的原理:把无序的数据变成有序的数据
1.把创建了索引的列的内容进行排序
2.对排序结果生成倒排表
3.在倒排表内容上拼上数据地址链
4.查询的时候,先拿到倒排表内容,再取出数据链,从而拿到具体数据
聚簇索引和非聚簇索引的区别:
聚簇索引:将数据存储与索引放到了一块,并且是按照一定的顺序组织,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引时相邻的,那么对应的数据也一定是相邻的存放在磁盘上的。
非聚簇索引:叶子节点不存储数据,存储的是数据行地址,也就是说根据索引查到数据行的位置再取磁盘查找数据,这个就有点类似于一本书的目录
InnDB中一定有主键,主键一定是聚簇索引,不手动设置、则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的隐藏id当做
主键索引,在聚簇索引之上创建的索引称为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索
引、唯一索引,辅助索引叶子节点存储的不是行的物理位置,而是主键值
MyISAM使用的是非聚簇索引没有聚簇索引,非聚簇索引的两棵B+树看
起来差不多,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,,辅助索引B+树存储了辅助键,表数据存储为独
立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据而言,这两个键没有任何的区别,对于索引树是独立的,通过
辅助键检索无需访问主键的索引树
如果涉及到大数据量的排序、全表扫描、count之类的操作的话,还是MyISAM占优势,因为索引所占空间少,这些操作是需要在内存中完成的
索引设计原则:
查询更快,占用空间更小
1.适合索引的列就出现在where子句中的列,或者连接子句中指定的列
2.基数较小的类,索引效果较差,没有必要建立索引
3.使用短索引,如果长字符串列进行索引,应该指定一个前缀长度,这样能够大量节省索引空间,如果搜索词使用索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配
4.不要过度索引,索引需要额外的磁盘空间,并降低写操作的性能,在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个世界就越长,所以只要保持需要的索引有利于查询即可
5.定义有外键的数据列一定要建立索引
6.更新频繁的字段不适合建立索引
7.若是不能有效区分数据的列不适合做索引列(如:性别,男女未知,最多也就三种,区分度太低)
8.尽量的扩展索引,不要新建索引,比如表中已经有a索引现在要加(a,b)索引,那么只需要修改原来的索引即可
9.对于那些查询中很少涉及的列,重复值比较多的列不适合建立索引
10.对于定义为text,image和bit的数据类型不要建立索引
ACID靠什么来保证:
A原子性由undo log日志保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql
C一致性由其他三大特性保证,程序代码要保证业务上的一致性
I隔离性由MVCC来保证
D持久性由内存+redo log来保证,mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复