MySQL开胃小菜

今天整理了mysql一些基础概念;
相信老铁看完会有所收获;

什么是索引 ?

什么是索引

  • 索引是一种能提高数据库查询效率的数据结构,它可以比作一本字典的目录,可以帮助我们尽快的找到对应的记录;
  • 索引一般存储在磁盘的文件中,它是占用物理空间的;
  • 正所谓水能载舟,也能覆舟。适当的索引能提高查询效率,过多的索引会影响数据库表的插入和更新功能;



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+树呢?

史大坨博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论