目录

  • 索引的概念
  • 索引的分类
  • 索引的机制
  • 索引的优缺点
  • 在哪些表上适合使用索引
  • 索引的使用
  • 索引使用注意事项
  • 各个索引区别
  • 索引优化策略

索引的概念

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

索引的分类

联合索引(复合索引)

  • 联合索引其实很简单,相对于一般索引只有一个字段,联合索引可以为多个字段创建一个索引
  • 它的原理也很简单,比如,我们在(a,b,c)字段上创建一个联合索引,则索引记录会首先按照A字段排序,然后再按照B字段排序然后再是C字段
  • 其实联合索引的查找就跟查字典是一样的,先根据第一个字母查,然后再根据第二个字母查
  • 或者只根据第一个字母查,但是不能跳过第一个字母从第二个字母开始查。这就是所谓的最左前缀原理
  • 联合索引的特点就是:
  • 1)第一个字段一定是有序的
  • 2)当第一个字段值相等的时候,第二个字段又是有序的,比如下表中当A=2时所有B的值是有序排列的,依次类推,当同一个B值得所有C字段是有序排列的

最左前缀查询举例

'''最左前缀原理'''#### 1、以下的查询方式都可以用到索引
'''
select * from table where a=1;
select * from table where a=1 and b=2;
select * from table where a=1 and b=2 and c=3;
上面三个查询按照 (a ), (a,b ),(a,b,c )的顺序都可以利用到索引,这就是最左前缀匹配。
'''#### 2、如果查询语句是:
'''
select * from table where a=1 and c=3; 那么只会用到索引a。
'''#### 3、这样不会用的索引
'''
select * from table where b=2 and c=3; 因为没有用到最左前缀a,所以这个查询是用户到索引的。
'''

前缀索引

1. 前缀索引就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引

2. 同时因为索引key变短而减少了索引文件的大小和维护开销。

3. 一般来说以下情况可以使用前缀索引:

1)字符串列(varchar,char,text等),需要进行全字段匹配或者前匹配。也就是=‘xxx’ 或者 like ‘xxx%’
2)字符串本身可能比较长,而且前几个字符就开始不相同。(比如:收件地址、外国人的姓名)

4. MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。

5. 但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。

主键索引

当把一张表的某列设置为主键的时候,则该列就是主键索引。
主键是一种唯一性索引,但它必须指定为 primary key,每个表只能有一个主键。
当一张表,把某个列设为主键的时候,则该列就是主键索引

1. **create table a(**
2. id **int primary key auto_increment,**
3. **name varchar(20) not null default ''**
4. );
5. //这里id就是表的主键
如果当创建表时没有指定主键索引,也可以在创建表之后添加:
alter table table_name add primary key (column name);

唯一索引

当表的某列被指定为unique约束时,这列就是唯一索引

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

create table test (id int primary key auto_increment , name varchar(32) unique);

test表中name就是唯一索引,唯一索引可以有多个null,不能是重复的内容
相比主键索引,主键字段不能为null,也不能重复

普通索引

一般来说,普通索引是先创建表,然后创建普通索引。

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

普通索引一般是在建表后再添加的,

create index 索引名 on table_name(column1,column2);alter table table_name add index 索引名(column1,column2);

全文索引

全文索引,主要是针对文件,比如文章的索引全文索引针对MyISAM有用,针对innodb没有用
​ 如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

首先,全文索引主要针对文本文件,

全文索引的版本、存储引擎、数据类型的支持情况

  1. MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
  2. MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
  3. 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
1. **create table c(**
2. id **int primary key auto_increment ,**
3. title **varchar(20),**
4. content text,
5. fulltext(title,content)
6. )engine=myisam charset utf8;
7. **insert into c(title,content) values**
8. ​    ('MySQL Tutorial','DBMS stands for DataBase ...'),
9. ​    ('How To Use MySQL Well','After you went through a ...'),
10. ​    ('Optimizing MySQL','In this tutorial we will show ...'),
11. ​    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
12. ​    ('MySQL vs. YourSQL','In the following database comparison ...'),
13. ​    ('MySQL Security','When configured properly, MySQL ...');

索引的机制

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

传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql需要将表的数据从头到尾遍历一遍
在我们添加完索引之后,mysql一般通过btree算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率),找到相应的键从而获取数据

如何评价索引性能

  • 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上
  • 这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级
  • 所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度
  • 换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数

为什么不建议使用过长的字段作为主键

1. 例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键

2. 因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

3. 再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,

4. 非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

索引的优缺点

优点:

创建索引可以大大提高系统的性能。

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点

  • 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

在哪些表上适合使用索引

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

  • 肯定在where条经常使用
  • 该字段的内容不是唯一的几个值
  • 字段内容不是频繁变化

索引的使用

索引使用原则

1、较频繁的作为查询条件字段应该创建索引
          select * from emp where empno = 1;

2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
          select * from emp where sex = ‘男’

3、更新非常频繁的字段不适合创建索引
          select * from emp where logincount = 1

4、不会出现在WHERE子句中的字段不该创建索引

使用或不使用索引的情况

1. 下列几种情况下有可能使用到索引

  • 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
  • 对于使用like的查询,查询如果是 ‘%aaa’ 不会使用到索引, ‘aaa%’ 会使用到索引

2. 下列的表将不使用索引

  • 如果条件中有or,即使其中有条件带索引也不会使用。
  • 对于多列索引,不是使用的第一部分,则不会使用索引。
  • like查询是以%开头
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’)
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。
  1. 建立索引

1、create [UNIQUE|FULLTEXT] index index_name on tbl_name (col_name
[(length)] [ASC | DESC] , ……);
2、alter table table_name ADD INDEX [index_name] (index_col_name,…)

  1. 删除索引

1、DROP INDEX index_name ON tbl_name;
2、alter table table_name drop index index_name;
注:删除主键(索引)比较特别: alter table t_b drop primary key;

  1. 创建普通索引方法

#1 查看student表中有哪些索引
          mysql> show index from student; #查看student表中有哪些索引

#2 创建最基本的的索引
          mysql> create index index_name on student(name(32)); #将student中字段name创建成索引

#3 删除索引的语法
          mysql> drop index index_name on student;

  1. 创建唯一索引

注: 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值
        #1创建索引
  mysql> create unique index index_name on student(name(32));

索引使用注意事项

  1. 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
    比如我们对title,content 添加了复合索引
    select * from table_name where title = ‘test’;会用到索引
    select * from table_name where content = ‘test’;不会用到索引
  2. 对于使用like的查询,查询如果是 ‘%a’不会使用到索引 ,而 like 'a%'就会用到索引。最前面不能使用%和_这样的变化值
  3. 如果条件中有or,即使其中有条件带索引也不会使用
  4. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来

各个索引区别

普通索引:最基本的索引,没有任何限制

唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。

主键索引:它 是一种特殊的唯一索引,不允许有空值。

全文索引:仅可用于 Myisam (米色母)表(默认表类型,如果执行大量的查询比较适合。),针对较大的数据,生成全文索引很耗时也耗空间。

索引优化策略

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)

索引优化的方式

# 1、最左前缀匹配原则,上面讲到了
# 2、主键外键一定要建索引
# 3、对 where,on,group by,order by 中出现的列使用索引
# 4、尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,
# 5、为较长的字符串使用前缀索引'''
# 6、不要过多创建索引, 权衡索引个数与DML之间关系,DML也就是插入、删除数据操作。这里需要权衡一个问题,建立索引的目的是为了提高查询效率的,但建立的索引过多,会影响插入、删除数据的速度,因为我们修改的表数据,索引也需要进行调整重建
''''''
# 7、对于like查询,”%”不要放在前面。SELECT * FROMhoudunwangWHEREunameLIKE'后盾%' -- 走索引 SELECT * FROMhoudunwangWHEREunameLIKE "%后盾%" -- 不走索引
''''''
# 8、查询where条件数据类型不匹配也无法使用索引 字符串与数字比较不使用索引; CREATE TABLEa(achar(10)); EXPLAIN SELECT * FROMaWHEREa="1" – 走索引 EXPLAIN SELECT * FROM a WHERE a=1 – 不走索引 正则表达式不使用索引,这应该很好理解,所以为什么在SQL中很难看到regexp关键字的原因

MySQL的索引及优化方案相关推荐

  1. MYSQL通过索引进行优化

    MYSQL通过索引进行优化 一:什么是索引: 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的 ...

  2. mysql 百万级数据库优化方案【转】

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  3. MySQL千万级数据优化方案

    简介 ↓↓↓处理千万级数据的MySQL数据库,可以采取以下优化措施↓↓↓ 使用索引:确保对经常用于查询和排序的字段添加索引.不要在查询中使用SELECT *,而是明确指定需要的字段. 分区表:如果表中 ...

  4. 关于MySQL联合索引和优化军规

    一.关于MySQL联合索引 总结记录一下关于在MySQL中使用联合索引的注意事项. 如:索引包含表中每一行的last_name.first_name和dob列,即key(last_name, firs ...

  5. mysql 模糊查询like优化方案(亲测)

    前言 本文的测试是基于740w条测试数据进行的,只讨论like模糊查询的优化方案.其他SQL优化可参考: SQL优化的几种方式 查询开头是"今天不开心"的聊天记录,是可以走索引的. ...

  6. mysql btree索引_MySQL优化之BTree索引使用规则

    MySQL优化之BTree索引使用规则 从一道题开始分析: 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的c1,c2,c3部分 A where c1=x and c2= ...

  7. elasticsearch亿级数据量全量索引导入优化方案

    Hbase scan读取时候,调大 hbase.client.scanner.timeout.period 超时时间,不然可能会跑异常 org.apache.hadoop.hbase.UnknownS ...

  8. 马老师 生产环境mysql主从复制、架构优化方案

    Binlog日志(主服务器) => 中继日志(从服务器 运行一遍,保持一致).从服务器是否要二进制日志取决于架构设计.如果二进制保存足够稳定,从性能上来说,从服务器不需要二进制日志.默认情况下, ...

  9. MySQL百万级数据库优化方案

    http://blog.csdn.net/luyee2010/article/details/8309806

最新文章

  1. sh脚本每天创建一个文件夹_我每天创建一个月的视频。 这就是发生的事
  2. 一文带你理解云原生|云原生全景指南
  3. 在vscode上编写jsp_使用vscode高效编写博客园博客
  4. 网易裁员事件双方和解;华为回应「推文攻击苹果」;PHP 7.4.0 发布 | 极客头条...
  5. SAP Basis常用事务代码
  6. MYSQL入门基础知识
  7. 计算机dos命令大全TXT,dos命令大全常见命令图解
  8. 数据地图搜索功能模块项目总结【springBoot+Elasticsearch】
  9. 电子邮件服务器匿名转发功能吗,你为什么不能匿名发送电子邮件
  10. Remove annoying AD window when PopKart exits
  11. 摸鱼还要提醒?用Python整个倒计时界面自觉摸鱼~
  12. LaaS,PaaS,SaaS介绍
  13. 戴尔服务器安装Debian11过程
  14. UBUNTU系统镜像定制
  15. addon游戏_addon_game_mode游戏基本情况设置
  16. P-手性单膦配体BaryPhos可实现Suzuki-Miyaura偶联反应
  17. 自制Unity文件查找器,支持拼音搜索
  18. 离开微信直接打开APP指定的页面
  19. 用计算机算出手机密码,怎么才能把计算机开机的密码解开
  20. 光学识别(OCR)之 Tesseract

热门文章

  1. 数据中心电池室管理之经济实用性方法的探索
  2. 蓄电池充放电试验培训课件
  3. 成功解决_catboost.CatBoostError: Bad value for num_feature[non_default_doc_idx=0,feature_idx=0]=“FDO09“:
  4. Dataset:(公交车、恐龙、大象、花朵、骏马)六类图片数据集(AutoKeras测试)的简介、下载、使用方法之详细攻略
  5. 成功解决The scripts freeze_graph.exe, saved_model_cli.exe, tensorboard.exe, tflite_convert.exe, toco.exe
  6. Py之huaweicloud-sdk-python:huaweicloud-sdk-python的简介、安装、使用方法之详细攻略
  7. HighNewTech:支付宝全球首发5G手机,四大逆天功能(防骗三折叠气味识别自由飞)!
  8. ML:从0到1 机器学习算法思路实现全部过程最强攻略
  9. Appstore|IPA
  10. 安卓8.1 字体 ——现在6.0,7.0,8.0都可以体验