一、什么是索引?

  索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。

二、索引的作用?

  索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高性能(查询速度)

三、优点:

  1. 通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。
  2. 可以加快数据的检索速度
  3. 可以加速表与表之间的连接
  4. 在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间

四、缺点

  1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  2. 索引需要占用物理空间,数据量越大,占用空间越大
  3. 会降低表的增删改的效率,因为每次增删改索引,都需要进行动态维护

五、什么时候需要创建索引

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找
  4. 查询中统计或者分组的字段;

 六、什么时候不需要创建索引

  1. 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
  2. where条件里用不到的字段,不创建索引;
  3. 表记录太少,不需要创建索引;
  4. 经常增删改的表;
  5. 数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。

七、索引的分类:

  1. 普通索引:最基本的索引,它没有任何限制
  2. 唯一索引:索引列的值必须唯一,且不能为空,如果是组合索引,则列值的组合必须唯一。
  3. 主键索引:特殊的索引,唯一的标识一条记录,不能为空,一般用primary key来约束。
  4. 联合索引:在多个字段上建立索引,能够加速查询到速度

 八、索引和sql语句的优化

1、前导模糊查询不能使用索引,

  如name like ‘%静’

2、Union、in、or可以命中索引,建议使用in

3、负条件查询不能使用索引,可以优化为in查询,

  其中负条件有!=、<>、not in、not exists、not like等

4、联合索引最左前缀原则,又叫最左侧查询,

  如果在(a,b,c)三个字段上建立联合索引,那么它能够加快a|(a,b)|(a,b,c)三组的查询速度。

5、建立联合查询时,区分度最高的字段在最左边

6、如果建立了(a,b)联合索引,就不必再单独建立a索引。

  同理,如果建立了(a,b,c)索引就不必再建立a,(a,b)索引

7、存在非等号和等号混合判断条件时,在建索引时,要把等号条件的列前置

8、范围列可以用到索引,但是范围列后面的列无法用到索引。

  索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引。范围条件有:<、<=、>、>=、between等。

9、把计算放到业务层而不是数据库层。

  在字段上计算不能命中索引,

10、强制类型转换会全表扫描,

  如果phone字段是varcher类型,则下面的SQL不能命中索引。Select * fromuser where phone=13800001234

11、更新十分频繁、数据区分度不高的字段上不宜建立索引。

  更新会变更B+树,更新频繁的字段建立索引会大大降低数据库性能。

  “性别”这种区分度不太大的属性,建立索引是没有什么意义的,不能有效过滤数据,性能与全表扫描类似。

  一般区分度在80%以上就可以建立索引。区分度可以使用count(distinct(列名))/count(*)来计算。

12、利用覆盖索引来进行查询操作,避免回表。

  被查询的列,数据能从索引中取得,而不是通过定位符row-locator再到row上获取,即“被查询列要被所建的索引覆盖”,这能够加速度查询。

13、建立索引的列不能为null,使用not null约束及默认值

14、利用延迟关联或者子查询优化超多分页场景,

  MySQL并不是跳过offset行,而是取offset+N行,然后放弃前offset行,返回N行,那当offset特别大的时候,效率非常低下,要么控制返回的总数,要么对超过特定阈值的页进行SQL改写。

15、业务上唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。

16、超过三个表最好不要用join,

  需要join的字段,数据类型必须一致,多表关联查询时,保证被关联的字段需要有索引。

17、如果明确知道查询结果只要一条,limit 1能够提高效率,比如验证登录的时候。

18、Select语句务必指明字段名称

19、如果排序字段没有用到索引,就尽量少排序

20、尽量用union all 代替 union。

  Union需要将集合合并后在进行唯一性过滤操作,这会涉及到排序,大量的cpu运算,加大资源消耗及延迟,当然,使用union all的前提条件是两个结果集没有重复数据。

21、使用合理的分页提高效率。

  select id,name from product limit 866613, 20

使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。

优化的方法如下:

可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。

比如此列中,上一页最大的id是866612。

SQL可以采用如下的写法:select id,name from product where id> 866612 limit 20。

参考:https://www.cnblogs.com/luffyxin/p/9898394.html

MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)的更多相关文章

  1. JDBC详解系列(四)之建立Stament和执行SQL语句

    建立Stament   在获得连接之后,我们就可以跟数据库进行交互了.   在JDBC中,我们发送SQL语句到数据库这些操作时通过Stament,Preparement,CallableStateme ...

  2. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  3. mysql 存储过程详解 存储过程

    mysql存储过程详解 1.      存储过程简介         我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成 ...

  4. MySQL存储过程详解 mysql 存储过程

    原文地址:MySQL存储过程详解  mysql 存储过程作者:王者佳暮 mysql存储过程详解 1.     存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储 ...

  5. MySQL存储过程详解 mysql 存储过程(二)

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...

  6. MySQL存储过程详解 mysql 存储过程(转)

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  7. mysql存储过程详解实例

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...

  8. mysql存储过程详解及基于PHP使用实例

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  9. MySQL权限详解

    MySQL权限级别介绍 MySQL权限级别 全局性的管理权限,作用于整个MySQL实例级别 数据库级别的权限,作用于某个指定的数据库上或者所有的数据库上 数据库对象级别的权限,作用于指定的数据库对象上 ...

随机推荐

  1. mysql使用命令行执行存储过程

    编写存储过程sql 以给brand表添加phone字段为例: DROP PROCEDURE IF EXISTS UpdateColum; CREATE PROCEDURE UpdateColum() ...

  2. android data binding jetpack V 实现recyclerview 绑定

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  3. CoordinatorLayout使用全解析

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

  4. 安卓之Android.mk编写

    题记:编译环境可以参考https://www.cnblogs.com/ywjfx/p/9960817.html 不管是写C还是java,我想所有的程序员都经历过HelloWorld程序的编写,现在让我 ...

  5. jenkins介绍及其简单操作

    一.jenkins简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包 ...

  6. mariadb数据库(2)增删改与 单表查询

    一.数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的 常用的数据类型 整数:int, bit 小数:decimal ...

  7. 绝对好用Flash多文件大文件上传控件

    本实例采用的是Uploadify上传插件,.NET程序,源程序是从网上找的,但是有Bug,已经修改好,并标有部分注释.绝对好用,支持单文件.多文件上传,支持大文件上传,已经过多方面测试,保证好用. 以 ...

  8. GCC 9.2 2019年8月12日 出炉啦

    GNU 2019-08-12 发布了 GCC 9.2https://gcc.gnu.org/onlinedocs/9.2.0/ 有详细的说明 MinGW 上可用的 GCC 9.2 版本下载地址 [ m ...

  9. java:easyui(重点示例)

    1.accordion(可折叠的): <!doctype html> <html lang="zh"> <head> <title> ...

  10. Jquery(DOM和选择器)

    O(∩_∩)O~~~,今天简单整理了一下最近所学的Jquery知识.下面就总结一下. 首先,对于Jquery我们需要简单了解下: 1.Jquery是开放源代码的JS库, 2.Jquery操作是函数式编 ...