(一)MySQL高级——索引

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Steriles_/article/details/83993839

一、索引

是帮助mysql高效获取数据的数据结构。索引的本质就是数据结构,可以简单理解为:“排好序的快速查找数据结构”

或者这样去理解:在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(可以理解为指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图就是一种可能的索引方式示例:

左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。

一般来说,索引本身也很大, 不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。

平时常说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引等等。

二、索引的优势

类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本;

通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

三、索引的劣势

实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引列也是要占用空间的。

虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,Mysql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

索引只是提高效率的一个因素,如果你的Mysql有大数据量的表,就需要花时间研究建立最优秀的索引,或者优化查询。

四、索引分类

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

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:即一个索引包含多个列

五、索引的基本语法

创建

CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));
-- 或者
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(lengeh));

删除

DROP INDEX [indexName] ON mytable;

查看

SHOW INDEX FROM table_name\G

另外补充:使用ALTER命令(有四种方式来添加数据表的索引)

-- 该语句添加一个主键,这意味着索引值必须使唯一的,且不能为NULL 
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)

-- 这条语句创建索引的值必须使唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD UNIQUE index_name(column_list)

-- 添加普通索引,索引值可出现多次
ALTER TABLE tbl_name ADD INDEX index_name(column_list)

-- 该语句指定了索引为FULLTEXT,用于全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)

六、适合创建索引的情况

1、主键自动建立唯一索引

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

3、查询中与其他表关联的字段,外键关系建立索引

4、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

5、查询中统计或者分组字段

6、单键或组合索引的选择问题(在高并发下倾向创建组合索引)

7、数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引

七、不适合创建索引的情况

1、频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录,还会更新索引

2、Where条件里用不到的字段不创建索引

3、表记录太少

4、经常增删改的表:提高了查询速度,同事却会降低更新表的速度,如对表进行INSERT、DELETE和UPDATE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件

5、如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。可以通话以下的话理解这个效果的含义:

假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建立索引一般不会提高数据库的查询速度。

索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。一个索引的选择性越接近于1,这个索引的效率就越高。

八、性能分析知识

1、MySQL Query Optimizer 

2、MySQL常见瓶颈

CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候

IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候

服务器硬件的性能瓶颈:top,free,iostat和vmstat来查看系统的性能状态

3、Explain

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/83993839