玖叶教程网

前端编程开发入门

MySql基础教学之"添加表索引"还不会的同学赶紧收藏

索引原理

1.为什么我们?添加完索引??后??查询速度会变快???

传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql需要将表的数据从头到尾遍历一遍

在我们添加完索引之后,mysql一般通过??BTREE算法??生成一个??索引文件??,在查询数据库时,找到索引文件进行??遍历(折半查找大幅查询效率)??,找到相应的键从而获取数据


2.索引的代价

创建索引是为产生索引文件的,??占用磁盘空间??

索引文件是一个??二叉树类型的文件??,可想而知我们的dml操作同样也会对索引文件进行修改,所以性能会下降


3.在哪些column上使用索引?

较频繁的作为查询条件的字段应该创建索引

唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如gender性别字段

更新非常频繁的字段???? 不适合作为索引??

不会出现在where子句中??的字段??不该创建索引??


总结: 满足以下条件的字段,才应该创建索引.

a: 肯定在where条??经常使用??

b: 该字段的内容??不是唯一的几个值

c: 字段内容??不是频繁变化??。

查看索引的使用情况?

show status like '%Handler_read%';

handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

查看表的所有索引和删除?

#查看:

show indexes from `表名`;

#或

show keys from `表名`;

#删除

alter table `表名` drop index 索引名;

索引四元素



  • 索引名称

用来标记索引

  • 索引字段

索引生成的原始对象和依据;

  • 索引类型

mysql索引的四种类型:??主键索引???、??唯一索引???、??普通索引???和??全文索引???。通过给字段??添加索引???可以??提高数据的读取速度???,提高项目的并发能力和抗压能力。??索引优化j是mysql中的一种优化方式。索引的作用相当于??图书的目录???,可以根据目录中的页码??快速找到所需的内容??。

? 主键索引:?

主键是一种唯一性索引,但它必须指定为??PRIMARY KEY??,每个表只能有一个主键。

alert table tablename add primary key(`字段名`)

?唯一索引:?

索引列的所有值都只能出现一次,即必须??唯一??,值可以为??空??。

alter table table_name add unique index(`字段名`);
#删除旧索引再添加alter table table_name drop index `字段名` , add unique index(`字段名`);

?普通索引 :?

??基本??的索引类型,值可以为空,没有唯一性的限制。

alter table table_name add index(`字段名`);

?全文索引:?

全文索引的索引类型为??FULLTEXT??。 全文索引可以在??varchar、char、text??类型的列上创建。 可以通过??ALTER TABLE??或CREATE INDEX命令创建。 对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。 ??MyISAM??支持全文索引,??InnoDB??在mysql5.6之后支持了??全文索引??。

全文索引??不支持中文???需要借??sphinx(coreseek)?????迅搜<、code>技术处理中文。??

alter table 表名 add FULLTEXT(`字段名`);
  • 索引方法

btree索引算法

InnoDB存储引擎默认的索引就是btree。

节点保存索引,而不是数据。所有的数据都保存在叶子节点,叶子节点不单保存数据,还包含指向数据指针,而且按照数据自小到大顺序链接。(这里说的是b+tree)

数据的插入、删除只在叶子节点进行。(这里说的是b+tree)

btree有两种,一种是btree,还有一种是b+tree。

数据库中说的btree一般说的是b+tree。这两种有什么区别呢?

  1. btree所有节点都是放索引和数据,而b+tree只在叶子节点放数据和索引,非叶子节点只存放索引。
  2. btree叶子节点相互独立,b+tree叶子节点有一条链相连。
  3. btree可以实现把热点数据放在离根节点进的节点,重复多次查询热数据更高效。
  4. b+tree,一次读取,在内存页获取更多的索引,更快缩小范围。
  5. 全局数据遍历,b+tree只要找到最小节点,然后通过链进行顺序遍历。而btree需要每层遍历。

hash索引算法

数据通过hash算法转换成定长的哈希值,将哈希值与数据的行指针存入hash表中对应的位置,如果哈希值相同,在对应的hash中以链表形式存储。这里的原理可以参考hashmap的put方法内部实现原理。

btree与hash区别

  1. btree可以用作范围查询,比如>,>=,<,<=和between,除去通配符开头查询。而hash只能用作对等查询。(这是因为使用hash建立的索引,它的顺序与原顺序无法保持一致。btree都是左节点<父节点<右节点。)
  2. hash一次定位数据,btree总是从根到叶子节点,所以hash检索效率高。
  3. hash不支持使用索引排序。
  4. hash不支持模糊查询以及最左前缀匹配。
  5. hash一定要回表查询数据,btree的聚簇索引可以不用回表索引。
  6. hash等值查询效率不一定比btree高。当哈希冲突很大,就会影响效率,而btree所有查询都是从根到叶子节点。

基于这些情况,数据库通常使用btree索引算法。


后话

你学会了吗?

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言