Mysql 索引相关

80 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

  • 数据库提效,索引是物美价廉的东西,不用加内存,不用改配置

索引原理

  • 为什么没有索引的话,查询数据量特别大的情况都会很慢?
    • 因为每次查询都是对 表进行全表扫描
    • select name from emp where id =1
    • 假设emp中表里有10条数据,查询语句在执行的时候查到1之后仍然不会停止,会对全表进行扫描查询。
  • 那么为什么索引快?
    • 添加索引会形成一个索引的数据结构,比如二叉树(当前仅了解到二叉树
      • 二叉树 等待后续补充,数据结构还未学到,当前做 二分查找来理解,二分查找会极大减少查询次数,换来性能提升。
  • 那么代价是什么
    • 前面提到索引会形成一个数据结构,而这个数据结构是占内存空间的,即,以空间换查询效率
      • 索引创建过多引发磁盘占用飙升
      • 对 dml(update,delete,insert 语句的执行效率造成影响

索引类型

  • 主键索引 主键自增为主索引 primary key
  • 唯一索引 unique
  • 普通索引 index
  • 全文索引 FULLTEXT 适用于 MyISAM
    • 在实际开发中考虑使用 solr,和 es 做代替

查询表中是否有索引

  • show index from zt_bug
    • Non_unique 如果为0,则表示是唯一索引,为1 则表示非唯一索引

索引操作

  • 例子 中 id_index 为索引名

添加唯一索引

  • create unique index id_index on tabName(columnName)

添加普通索引

  • create index id_index on tabName(columnName)
  • alter table tabName add INDEX id_index (columnName)

添加主键索引

  • alter table tabName add primary key (columnName)

删除索引

  • drop index id_index on tabName; id_index 为索引名称

删除主键索引

  • alter table tabName drop primary key 因为一张表主键只有一个,所以删除主键,不需要指定columnName

修改索引

  • 先删除,后进行修改

查询索引

  • 方式1
    • show index from tabName
  • 方式2
    • show indexs from tabName
  • 方式3
    • show keys from tabName
  • 方式4
    • desc tabName

什么字段适合创建索引?

1 较频繁的作为查询条件的字段应当创建索引 2 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件 3 更新非常频繁的字段不适合创建索引 4 不会在where 子句中出现的字段不应当做索引