Mysql高级(三) 索引概述

2020-05-02  本文已影响0人  卡戎li

一、索引定义

索引(Index)是帮助Mysql高效获取数据等数据结构。

索引是排好序的快速查找数据结构,故影响sql执行中的查找和排序。

二、索引的优势和劣势

2.1 索引优势

索引大幅度提高了查询效率,降低了数据库的IO成本。降低了数据排序成本,降低了CPU的消耗。

2.2 索引劣势

因为索引是一个独立的表,里面存了主键与索引字段,并且指向实体表的记录,所以也是占空间的。并且虽然有了所以之后查询速度快,但是对相应数据更新(insert、update、delete)的速度变慢了,所以对于那些经常需要更新的数据表尽量不要加索引。

三、索引分类

3.1 单值索引

一个索引只包含单个列,一个表可以有多个单值索引

3.2 唯一索引

索引列的值必须唯一,单允许空值

3.3 复合索引

一个索引包含多个列

3.4 全文索引

这是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值,全文索引更类似于搜索引擎做的事情,实际生产中我们一般不会使用MySQL来做类似搜索引擎的工作

3.5 聚簇索引

聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据

聚集索引(InnerDB):
1、建表的时候,如果指定了主键,则主键就是聚簇索引。
2、建表的时候,如果没有指定主键,且含有唯一索引,则会选择一个唯一的非空索引作为聚簇索引。
3、如果即不含有主键,也不含有唯一索引,则隐式使用6个字节的rowId作为聚簇索引。

四、索引的基本操作

show index from tblname;

CREATE INDEX index_name ON table(column(length))

ALTER TABLE table_name ADD INDEX index_name ON (column(length))


    CREATE TABLE `table` (

    `id` int(11) NOT NULL AUTO_INCREMENT ,

    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,

    `time` int(10) NULL DEFAULT NULL ,

    PRIMARY KEY (`id`),

    INDEX index_name (title(length))

    )

DROP INDEX index_name ON table

五、创建索引建议

5.1 适合建索引

a、主键自动建立唯一索引
b、频繁作为查询条件的字段时候建立索引
c、查询中与其它表关联的字段,外键关系建立索引
d、where 里用不到的不建立索引
e、查询中排序的字段,建立索引将大大提高排序速度
f、查询中统计或分组的字段

5.2 不适合建索引

a、表记录太少
b、经常增删改的表,建立索引将使得更新变慢
c、数据重复,且分布平均的字段

六、Mysql索引结构

MySql索引使用的数据结构是B+树

a、使用hash存储必须使用好的hash算法。
b、hash存储由于数据分布的不均衡,比较占用内存。
c、hash存储不能进行范围查询,范围查询多于等值查询。(关键点)

当插入的节点越来越多,会导致树的深度越来越深,导致查询变慢。

6.1 BTree索引

6.2 Hash索引

6.3 Full-text全文索引

6.4 R-Tree索引

七、关于索引的常见问题

3~4层足够

索引字段存储空间越小越好

会引起底层的数据分裂或合并,影响性能

上一篇 下一篇

猜你喜欢

热点阅读