谈一下对MySQL索引的理解?
存储引擎
创建方式:
create table emp(id int) engine=innodb/myisam;
show engine;
define:数据在磁盘上的不同组织形式。
数据在磁盘上的不同组织形式。
innodb :'.idb' 支持事务、外键、表锁和行锁
myisam :'myd'和'myi' 不支持事务、外键;只支持表锁
存储方式不同。
innodb默认读取16kb的数据,在插入数据的时候,必须将数据跟某一列索引例绑定到一起。
**索引的是数据结构都是B+树**
Hash表也可以作为索引的数据结构,必须是memory存储引擎;
memory存储在内存中,断电之后会数据丢失。
innodb存储引擎支持自适应hash,用户不可以干扰;
一个表中包含多个索引列,那么数据文件会存储几份?
保存一份
数据结构
B+树:
Hash表:数组+链表
1.使用hash表必须要保证具备好的hash算法,如果算法不合适会造成hash冲突或是hash碰撞,会导致数据散列不均匀,可能会退化成一个链表。
2.使用hash不能进行范围查询;
3.需要大量的内存空间。
二叉树、AVL、红黑树为什么不能作为索引结构?
1.都是树;
2.分支有且仅有两个;
局部性原理:时间局部性和空间局部性
磁盘预读:
尽可能多的减少要去局的数据量,通过减少数据访问的次数
索引的分类
聚簇索引和非聚簇索引
数据跟索引放在一起的叫聚簇索引
数据跟索引不放在一起的叫非聚簇索引
索引涉及到常问的几个名词
回表:从某一索引叶子节点中获取聚簇索引的id值,根据id再去聚簇索引中获取全量记录;
尽量减少回表查询
索引覆盖:从索引的叶子结点中获取全量查询列的过程叫索引覆盖。
最左匹配(组合索引):MySQL优化器会进行优化,选择合适的顺序来执行;
从组合索引的左边向右边匹配。
例如:组合索引(name,age):先匹配name在匹配age
select * from student where age=22; #无法匹配成功
**索引下推:**(这边没太听懂,希望有大佬给讲解一下)
SQL谓词下推
SQL优化
(1)SQL语句的优化;
(2)索引的优化;
(3)表结构的优化;
(4)事务的处理;一系列操作语句
(5)锁表的问题;
(6)系统配置的优化;
(7)硬件、服务器的优化。
当表中全部字段多是索引列时,无论进行什么样的查询都会用到索引。
索引不是越多越好,也不需要在全部列上添加索引
分库分表常用技术:mycat,shardingsphere(推荐),drds.