一、什么是索引?

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

二、索引的作用?

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

三、优点:

通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。

可以加快数据的检索速度

可以加速表与表之间的连接

在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间

四、缺点

创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

索引需要占用物理空间,数据量越大,占用空间越大

会降低表的增删改的效率,因为每次增删改索引,都需要进行动态维护

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

主键自动建立唯一索引

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

查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找

查询中统计或者分组的字段;

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

频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件

where条件里用不到的字段,不创建索引;

表记录太少,不需要创建索引;

经常增删改的表;

数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,因此他建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。

七、索引的分类:

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

唯一索引:索引列的值必须唯一,且不能为空,如果是组合索引,则列值的组合必须唯一。

主键索引:特殊的索引,唯一的标识一条记录,不能为空,一般用primary key来约束。

联合索引:在多个字段上建立索引,能够加速查询到速度

八、索引和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。
————————————————
版权声明:本文为CSDN博主「Dear方丈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42284052/article/details/113220719

mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...相关推荐

  1. mysql安装包含哪几种文件_MySQL安装详解

    MySQL安装详解 [下载地址:http://dev.mysql.com/downloads/] 参考文献:http://dev.mysql.com/doc/refman/5.1/zh/install ...

  2. mysql数据类型设计说明_MySQL的数据类型和建库策略分析详解

    MySQL的数据类型和建库策略分析详解 更新时间:2008年04月06日 01:16:47   作者: 无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构.充分利用空间是十分必要的 ...

  3. mysql配置文件说明_mysql配置文件详解说明

    mysql配置文件http://www.doczj.com/doc/ef8ad6026c175f0e7cd1371f.htmlf详解说明 MySQL配置文件http://www.doczj.com/d ...

  4. 简述mysql完全备份过程_【SQL】MySQL之使用mysqldump全备份及恢复过程详解_MySQL

    mysqldump bitsCN.com [SQL]MySQL之使用mysqldump全备份及恢复过程详解 [目标]使用mysqldump做全备,结合mysql自带的binlog功能实现增量备份 为了 ...

  5. sql加上唯一索引后批量插入_阿里大佬总结的52条SQL语句性能优化策略,建议收藏...

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 cnblogs.com/SimpleWu/p/9929043.html 推荐:h ...

  6. 【MySQL】47 条SQL语句性能优化策略

    本文会提到 47 条 SQL 语句性能优化策略. 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引. 2. 应尽量避免在 WHERE 子句中 ...

  7. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  8. ORACLE的索引和约束详解数据库

    ORACLE的索引和约束详解数据库 Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义 ...

  9. Django--filter()-字段查找(双下划线的使用详解)

    Django--filter()-字段查找(双下划线的使用详解) 在了解django中的字段查找的同时,让我们先熟悉一下比较符: 大于--gt-(greater than) 小于--lt-(less ...

最新文章

  1. nginx防止高负载的解决方案(sysgurad模块)
  2. Python Numba实现GPU加速
  3. SMB(Server Message Block) Protocal Research
  4. logisim设计alu设计报告_【新】PowerBI 报告设计思想 结构布局篇
  5. 第四章 源代码的下载和编译
  6. dateformat java_java常用API之DateFormat
  7. Spring Framework中的作用域代理
  8. 【OS学习笔记】十四 保护模式二:段描述符
  9. 【POJ】2823 Sliding Window
  10. 什么是分布式查询mysql_基础普及之什么是分布式SQL
  11. 来看看你更适合哪一种Ubuntu
  12. CISSP 重点知识点总结3
  13. PHP第一季视频教程.李炎恢.学习笔记(三)(第2章 基本语法(2))
  14. x86设备直接刷写二合一群晖系统,带扩容二合一硬盘教程
  15. 使用STVD和Cosmic C编译器开发STM8S快速入门指南
  16. 航天信息上传服务器地址,金税盘上传参数设置怎么设置?
  17. 图基(Tukey)检验
  18. 高斯消元法求解线性方程组
  19. 分享:把个人网站封装生成百度小程序的方法
  20. NB-IOT经典案例

热门文章

  1. html点击波,Material Design风格按钮点击波动画效果
  2. oracle10g 6.0更改5.2,Oracle 10G 10.2.0.1升级到10.2.0.5
  3. java斐波那切数列_Java中的递归方法
  4. Kafka分区分配策略(Partition Assignment Strategy)
  5. Linear Regression、Logistic Regression、激励函数activation function(relu,sigmoid, tanh, softplus)
  6. 04_Pytorch生态、PyTorch能做什么、PyTorch之Autograd、autograd案例、GPU加速案例
  7. UML类图中的各种箭头代表的含义(转自:http://www.cnblogs.com/damsoft/archive/2016/10/24/5993602.html)
  8. 01_基于应用拆分的技术架构
  9. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效
  10. kill linux 信号量,kill用法详细解释(特别是信号量9的使用以及理解)