索引优化

对于开发人员,说起数据查询优化,最简单也是最常用的一个方案就是创建索引。可以说索引是所有开发人员接触的第一个查询优化的方案。

在数据库中,我们通过创建索引可以大大提高查询的速度,一个好的索引可以另SQL的查询更加效率。而一个错误的索引不仅带不来效率的提高,甚至会带来额外的系统开销

索引的基本操作

创建索引

建表时创建索引

建表的时候指定

CREATE TABLE user(ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)));

CREATE创建索引

为已有的表添加

CREATE INDEX indexName ON user(username(length));

主键索引

该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL

ALTER TABLE user ADD PRIMARY KEY (ID)

唯一索引

这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)

ALTER TABLE user ADD UNIQUE indexName (username)

普通索引

添加普通索引,索引值可出现多次

ALTER TABLE user ADD INDEX indexName (username)

全文索引

该语句指定了索引为 FULLTEXT ,用于全文索引。仅可用于 MyISAM 表,
用于在一篇文章中,检索文本信息的。

ALTER TABLE user ADD FULLTEXT indexName (username)

联合索引

组合索引(包含多列的索引,与单行索引相对),遵循最左原则

ALTER TABLE user ADD INDEX indexName ( `column1`, `column2`, `column3` )

删除索引

DROP INDEX indexName ON user;

修改索引

alter TABLE user add INDEX indexName on(username(length))

查询索引信息

使用 show index 命令来列出表中的相关的索引信息。可以通过添加 \g 来格式化输出信息。

SHOW INDEX FROM user

使用索引

使用索引时候需要注意的

  1. LIKE关键字匹配’%‘开头的字符串,不会使用索引,但是以’%'结尾的可以。
  2. OR关键字的两个字段必须都是用了索引,该查询才会使用索引。
  3. 使用多列索引必须满足最左匹配.

数据库索引的原理

一般来说数据库索引是使用B+tree的数据结构

使用B+树,并不是二叉树而是指的平衡树,它可以根据键值快速找到数据。B+树索引通过键值可以快速定位数据行所在的页,然后数据库通过页内容读入内存,而在内存中定位到数据。

数据库索引可以实现效果

  1. 可以避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页。
  2. 对于非聚集索引,有时不需要访问数据页即可得到数据。
  3. 聚集索引可以避免数据插入操作,集中于表的最后一个数据页面。
  4. 在某些情况下,索引可以避免排序操作。

无索引的查询中,没有使用索引的情况下扫描每个记录来查找符合条件的记录。

数据库索引的不足

  1. 数据库索引使用了空间换时间的策略,建立的索引会占用磁盘空间。随着数据的增加,索引文件会膨胀很快。
  2. 数据库不仅需要保存数据还需要保存索引文件,这就导致对表进行更新或者删除操作的时候速度降低。
  3. 索引越多会让数据更新操作的时候变得更慢,不合理的索引会拖慢数据库的整体效率。

创建索引的原则

  1. 主键列默认使用了索引
  2. 假如有外键定义也需要建立索引
  3. 经常被作为查询条件的列最好建立索引
  4. 经常需要被排序、分组的字段建立索引,如果是复合索引,则需要排序、分组的顺序和索引顺序一致
  5. 极少作为查询条件、或者数据存在大量重复的列不需要建立索引
  6. 对于数据较多的字段,最好不要建立索引
  7. 经常被修改的字段,最好不要建立索引
  8. 多表连接查询的时候,连接字段上应该建立索引
  9. 频繁被修改的表,最好不要建立太多的索引
  10. 检查索引,删除无用的索引
  11. 正确算是创建复合索引
    1. 对于复合索引,第一个字段应该是使用频率最高的字段
    2. 复合索引中的几个字段,需要经常以AND方式出现在条件语句中,否则不需要创建复合索引
    3. 复合索引中的字段不宜过多(3个及以下)
    4. 一个字段有单独查询也有关联查询,一般来说创建单独索引而不需要创建复合索引

添加索引带来的优化

这里我就贴一个网友的文章,虽然是很多年前的文章,但是里面内容依旧有用:https://blog.csdn.net/gprime/article/details/1687930

数据库查询优化-添加索引相关推荐

  1. 数据库查询优化——Mysql索引

    工作一年了,也是第一次使用Mysql的索引.添加了索引之后的速度的提升,让我惊叹不已.隔壁的老员工看到我的大惊小怪,平淡地回了一句"那肯定啊". 对于任何DBMS,索引都是进行优化 ...

  2. Mysql在线添加索引

    在实际工作中,经常遇到需要给数据库表添加索引的情况.虽然操作是由dba来执行,但开发还是应该了解在线添加索引会引起的性能问题.比如博主最近就遇到了线上添加索引导致业务报警的问题. 问题描述 出于业务需 ...

  3. SQL查询优化方法 提高SQL查询效率 数据库的哪些字段适合添加索引

    如何提高sql的查询效率 在正确的字段上创建索引. 优化查询sql的写法(特别是where语句的写法). 一.数据库的哪些字段适合添加索引 表的某个字段值得离散度越高,该字段越适合选作索引的关键字.主 ...

  4. MySQL数据库篇之索引原理与慢查询优化之一

    主要内容: 一.索引的介绍 二.索引的原理 三.索引的数据结构 四.聚集索引与辅助索引 五.MySQL索引管理 六.测试索引 七.正确使用索引 八.联合索引与覆盖索引 九.查询优化神器--explai ...

  5. mysql数据库添加索引和去重

    1. 数据库添加索引 alter table dir_list add index dir_name(dir_name); alter table dir_list add index file_na ...

  6. 【Mysql数据库】数据库添加索引方式

    文章目录 数据库添加索引方式 1.添加PRIMARY KEY(主键索引) 2.添加UNIQUE(唯一索引) 3.添加普通索引 4.添加全文索引 5.添加多列索引 数据库添加索引方式 1.添加PRIMA ...

  7. 小蚂蚁学习mysql性能优化(5)--SQL以及索引优化--需要添加索引的列

    2019独角兽企业重金招聘Python工程师标准>>> 在哪些列上添加索引? 1.    通常选择在where从句中,group by从句,order by从句,on从句中出现的列添 ...

  8. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  9. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

  10. 为什么数据库使用有序索引,而程序员却在使用哈希表?

    为什么程序和数据库之间的"默认"选择会产生不同呢? 作者 | Evan Jones 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 以下为译文: 我可 ...

最新文章

  1. 卸载ORACLE 11g
  2. Hibernate第一次课(2)---Hibernate原理简介
  3. 计算机如何搜索相关文字,搜索引擎:“请输入你要搜索的内容”|你是如何使用搜索引擎的呢?...
  4. 安装scipy报错,疑似缺少wheel包,解决方案
  5. C - Internet Address CodeForces - 245B(有些思维的水题)
  6. linux ini文件,Shell script - Linux下解析ini配置文件
  7. 模板:莫比乌斯反演(数论)
  8. 95-190-742-源码-WindowFunction-AllWindowFunction
  9. --------------比大小---------------大数比大小 这个方法 值得 留念
  10. 只因一段代码全公司200多人被捕,爬虫敲响警钟!
  11. echarts使用rich设置显示数据label颜色
  12. java字符串在字符中的位置_Java如何获取字符在字符串中的位置
  13. 从.weights中提取权重数据
  14. mysql主从配置duxi_做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table...
  15. 简单的链表封装(类)
  16. SpringBoot中通过接口下载resources下的文件
  17. html中怎样插入视频博客园,关于博客园内嵌入bilibili视频
  18. 分布式事务 - 三种常见的解决方案
  19. 2012年9月11日全校网络中断,人称9.11事件。
  20. 一零四、前端性能优化详解

热门文章

  1. 关于求数列极限的方法的总结
  2. uygurqa输入法android,uygurqa输入法app
  3. 通过工具XShell4生成密钥对(公钥和私钥)
  4. 购物中心节假日如何统计客流量分析客流量数据?
  5. PLSQL 使用教程
  6. golang json 转 map 切片 结构体
  7. winsdk仿win7扫雷
  8. MATLAB局部放大
  9. 计算机科学与技术实训内容,计算机科学与技术专业实训大纲.doc
  10. Linux系统tomcat修改端口