索引
索引原理
常用的索引模型有哈希索引,有序数组,搜索树。
哈希索引,适合等值查找,范围查找会触发全表扫描
有序数组索引,等值查找和范围查找效率高,但是在数组中间插入数据时会挪动该记录后面的数据。
innodb中每个索引都维护一个B+tree。主键索引叶子节点上key是主键值,value是行记录。非主键索引叶子节点上key是字段值,value是主键值。
索引优化
-- auto-generated definition
create table test
(
id int auto_increment
primary key,
name varchar(40) null,
age int(12) null,
status int null
);
create index name_age_k
on test (name, age, status);
1.覆盖索引
如果一个索引包含所有需要查询的字段,这种行为就称为覆盖索引
2.B+tree最左前缀
类型转换时,字符串转数字依然可以使用索引,而数字转字符串则索引失效
3.索引下推
比如a,b,c,组成联合索引,sql条件是where a=1 and b >1 and c>1。如果没有索引下推,则查询a=1的数据给server,server层在判断b >1 and c>1。如果使用索引下推,则在引擎层就判断b >1 and c>1,返给server层的数据已经是结果数据了。
自增主键和UUID主键有什么区别
自增主键:
1.符合innodb索引存储是顺序递增存储特点,不对挪动其他数据,插入效率高,不会触发页分裂和页合并。
2.节省空间,非主键索引叶子节点是存储的是主键值,如果主键占用空间小,则会节省空间。
3.分布式数据库中,如果分表合并会主键冲突,无法确定主键的唯一性。可以自定义主键生成算法,既有顺序性,又有唯一性。如twitter的雪花算法
4.自增主键插入时,会有自增锁和间隙锁。
存储
innodb和myisam区别
myisam记录和索引分开存储,最小锁粒度是表锁,不支持事务,不支持外键,适用于大量读操作
innodb需要更多内存来缓存数据
https://segmentfault.com/a/1190000008227211
mysql cpu占用高
查看线程执行sql耗时情况。如果sql耗时长,可以优化sql
show full processlist;
网友评论