今天整理了mysql一些基础概念;
相信老铁看完会有所收获;
什么是索引 ?
- 索引是一种能提高数据库查询效率的数据结构,它可以比作一本字典的目录,可以帮助我们尽快的找到对应的记录;
- 索引一般存储在磁盘的文件中,它是占用物理空间的;
- 正所谓水能载舟,也能覆舟。适当的索引能提高查询效率,过多的索引会影响数据库表的插入和更新功能;
MYSQL索引有哪些类型 ?
数据结构维度
- B+ 树索引:所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
- 哈希索引:适合等值查询,检索效率高,一次到位。
- 全文索引:MyISAM和InnoDB中都支持使用全文索引,一般在文本类型char、text、varchar类型上创建。
- R-Tree索引:用来对GIS数据类型创建SPATIAL索引。
物理存储维度
- 聚集索引:聚集索引就是以主键创建的索引,在叶子节点存储的是表中的数据。(Innodb存储引擎)
- 非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。(Innodb存储引擎)
逻辑维度
- 主键索引:一种特殊的唯一索引,不允许有空值。
- 普通索引:MySQL中基本索引类型,允许空值和重复值。
- 联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
- 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
- 空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。
索引什么时候会失效 ?
- 查询条件包含
or
, 可能会导致索引失效; - 如果字段类型是字符串 ,
where
时一定用引号括起来 , 否则索引失效 俗称 隐式转化
; like
通配符可能导致索引失效;- 联合索引 , 查询时的条件列不是联合索引中的第一列 , 索引失效;
- 在索引列上使用mysql的内置函数 , 索引失效;
- 在索引列上使用运算
(如+、-、*、/)
, 索引失效; - 索引字段上使用
is null、is not null
, 可能会导致索引失效; - 左连接查询或者右连接查询关联的字段编码格式不一样 , 可能导致索引失效;
- mysql 估计使用全表扫描要比使用索引快 , 则不使用索引;
哪些场景不适合建立索引 ?
- 数据量少的表不适合加索引;
- 更新比较频繁的也不适合加索引;
- 区分度低的字段不适合加索引 (如性别);
where、group by、order by
等后面没有使用到的字段,不需要建立索引;- 已经有冗余的索引的情况 (比如已经有
a,b
的联合索引,不需要再单独建立a
索引);
为什么要用 B+ 树,为什么不用二叉树?
可以从几个纬度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?