存储引擎相关
MyISAM与InnoDB区别
?
InnoDB:支持数据库事务,还提供了行锁和外键。
MyIASM:不支持事务,也不支持行级锁和外键。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
MyISAM索引与InnoDB索引的区别
?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
InnoDB的非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
存储引擎如何选择
?
一般没有特别需求,使用默认的Innodb即可。
MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。
Innodb:更新(删除)操作频率高或者需要保证数据的完整性,并发量高,支持事务和外键。比如OA自动化办公系统。
索引相关
索引覆盖是什么
?
如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描),这叫索引覆盖。因此我们要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率
索引有哪几种类型
?
主键索引
: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引
: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
可通过 ALTER TABLE table_name ADD UNIQUE (column)
; 创建唯一索引
可通过 ALTER TABLE table_name ADD UNIQUE (column1,column2)
; 创建唯一组合索引
普通索引
: 基本的索引类型,没有唯一性的限制,允许为NULL值。
可以通过ALTER TABLE table_name ADD INDEX index_name (column);
创建普通索引
联合索引
:指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。
可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)
;创建联合索引
全文索引
: 是目前搜索引擎使用的一种关键技术。
可以通过ALTER TABLE table_name ADD FULLTEXT (column)
;创建全文索引
创建索引的原则
?
(1) 最左前缀原则
:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)停止匹配,如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
(2) 定义主键、外键的数据列一定要建立索引
(3)频繁作为查询条件的字段需要创建索引
(4) 更新频繁的、查询很少的、重复值比较多字段不适合创建索引
(5) 尽量的扩展索引,不要新建索引。如表中已经有a的索引,现在要加(a,b)的索引,那么只需修改原来的索引就可以