当前位置:Gxlcms > 数据库问题 > MySQL 索引

MySQL 索引

时间:2021-07-01 10:21:17 帮助过:2人阅读

index_student on tb_student(id,name); #创建索引,指定索引名称,要使用哪张表的哪些字段来创建索引

drop index index_student on tb_student; #删除索引

show index from tb_student; #查看某个表上所有的索引

其实不管是索引,还是视图,都很少用命令行来操作,太麻烦,一般都是在数据库管理工具(比如Navicat)中直接操作。

索引是在 表结构|表定义|设计表 中操作的。

 

 

 

索引方式

索引方式有2种:

(1)btree  使用b+树的方式建立索引

比如选择id列来创建索引,假设有7条记录,id 1~7

技术图片

查找id=7的记录的地址:4 -> 6 -> 7 

一般都是使用btree,因为很多存储引擎都支持btree。InnoDB只支持btree,不支持hash。

 

 

(2)hash   通过hash值一次直接找到记录的地址

比如使用id列建立索引,查找id=7的记录,根据7的hash值直接定位到对应记录的地址。

btree要一级级的找,要通过多个节点;hash一次就找到,查询效率远高于btree。

但hash用得较少,因为只有memory存储引擎支持hash

 

 

 

说明

  • 一张表添加主键时,会自动给主键列创建唯一索引(Unique);添加外键时,会自动给外键列创建普通索引(Normal)。
  • 在数据库管理工具(navicat)中能看到外键自动创建的索引,但看不到主键自动创建的索引;在mysql自带的命令行客户端使用 show index from 表名; 可以看到该表所有的索引,包括主键自动创建的索引。
  • 创建索引后,从表中找匹配的记录时会自动选择合适的索引来使用,不需要我们指定索引。

 

 

 

哪些字段适合创建索引?

  • 主键
  • 外键   这2个不用管,会自动创建
  • 频繁作为条件的字段,比如经常要用where name=‘ xxx‘,那就给name字段创建索引
  • group by分组使用的字段
  • order by排序使用的字段
  • 统计(聚合函数)使用的字段

 

 

哪些字段不适合创建索引?

  • 频繁更新(update)的字段。要频繁同步到索引(维护索引),开销很大。
  • 有很多重复值的字段。比如dep_id,tb_student很多记录的dep_id都是相同的。

 

 

哪些表不用创建索引?

  • 记录很少的表
  • 经常进行增删改的表。维护索引开销大

 

MySQL 索引

标签:orm   效率   varchar   _id   width   har   空间   工具   class   

人气教程排行