背景:总结mysql索引相关的知识点.

MySQL 索引及查询优化总结

ps:其中的b+树有误。对or的使用有误。总体还是很详尽的

注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换。MEMORY/HEAP存储引擎:支持HASH和BTREE索引。

1、索引我们分为四类来讲单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、

mysql索引类型:

主键索引 primary key 不允许null

唯一索引  union key  可以为null

普通索引 index

联合索引

全文索引

建立索引的原则:

最左匹配原则 遇到范围查询(>、

尽量选择区分度高的列作为索引

=和in可以乱序

索引列不能参与计算,保持列“干净”。 假如索引列参与计算的话,那每次检索时,都会先将索引计算一次,再做比较,显然成本太大。

尽量的扩展索引,不要新建索引

补充:尽量扩展索引、不要新建索引 mysql目前主要索引有:FULLTEXT,HASH,BTREE 好的索引可以提高我们的查询效率,不好的索引不但不会起作用,反而给DB带来负担,基于BTREE结构,插入、修改都会重新调整索引结构,存储成本增加,写效率降低,同时DB系统也要消耗资源去维护。 基于刚才的最左匹配原则,尽量在原有基础上扩展索引,不要新增索引。 能用单索引,不用联合索引;能用窄索引,不用宽索引;能复用索引,不新建索引。 回到线上案例: nc_tms_order、ct_order看看分别有哪些索引

索引的不足:空间,时间,开销

常用优化总结:

有索引但未被用到的情况(不建议) (1) Like的参数以通配符%开头时 (2) where条件不符合最左前缀原则时 (3) 使用!= 或 <> 操作符时(使用>或

避免select *  在解析的过程中,会将'*' 依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。

order by 语句优化  1)重写order by语句以使用索引;2)为所使用的列建立另外一个索引 3)避免在order by子句中使用表达式

提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉

使用 varchar/nvarchar 代替 char/nchar

在Join表的时候使用相当类型的例,并将其索引

优化嵌套查询:子查询可以被更有效率的连接(Join)替代;

很多时候用 exists 代替 in 是一个好的选择

mysql索引的分类

理解mysql搜索引的实现:

MyISAM索引实现:

MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。

InnoDB索引实现:

MyISAM索引和InnoDB索引的不同:

第一个重大区别是InnoDB的数据文件本身就是索引文件。innodb 聚集索引data域存放的是数据的记录,mylsam的data域存储的是记录的地址

从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。mylsam辅助索引data域存储的是地址。

exists和in的区别?

mysql myclre_mysql 索引及查询优化总结相关推荐

  1. mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化

    本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...

  2. mysql六:索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  3. mysql聚合索引创建_为 MySQL 查询优化选择最佳索引

    我们的许多用户.开发者和数据库管理员不断向我们的团队咨询有关 EverSQL 的索引推荐算法.所以,我们决定写一些这方面的内容. 本教程不会详细介绍该算法的所有内部特性,而是要简单地说明索引最重要的方 ...

  4. mysql之索引原理与慢查询优化

    一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语 ...

  5. MySQL索引与查询优化

    目录 About MySQL Why MySQL MySQL Index Why Index 索引是如何工作的 如何使用 创建索引 查看索引 删除索引 索引的使用原则 写操作比较频繁的列慎重加索引 索 ...

  6. mysql+索引优化+查询优化+存储优化_mysql利用覆盖索引避免回表优化查询

    前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...

  7. MySQL - 践行索引优化

    文章目录 生猛干货 Pre Table Demo DB Version Case 全值匹配 最左前缀 禁止索引列上做任何操作(计算.函数.(自动or手动)类型转换) 存储引擎不能使用索引中范围条件右边 ...

  8. MySQL的索引及优化方案

    目录 索引的概念 索引的分类 索引的机制 索引的优缺点 在哪些表上适合使用索引 索引的使用 索引使用注意事项 各个索引区别 索引优化策略 索引的概念 通过给字段添加索引可以提高数据的读取速度,提高项目 ...

  9. MySQL设计索引的原则

    1. 搜索的索引列,不一定是所要选择的列. 换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列 . 2. 使用惟一索引 ...

最新文章

  1. 读书笔记-我所理解的生活
  2. linux下数据库的基本管理,数据库的管理_linux 运维之道 基础篇的技术博客_51CTO博客...
  3. android studio wcf,将图像从android studio上传到Wcf Service
  4. 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
  5. 国产嵌入式操作系统发展思考
  6. Java高级开发必会的50个性能优化的细节(珍藏版)
  7. C++中的inline用法
  8. [转]CSS浏览器兼容问题总结
  9. Java 多态 ——一个案例 彻底搞懂它
  10. 计算机视觉目标检测算法总结4——其他SSD系列算法
  11. 深入理解Android壁纸
  12. 解决visual studio安装Dev后不显示控件或控件灰色不可用
  13. php 中国地图编辑,科学网—如何正确绘制中国示意性地图?编辑给您提建议 - 科学出版社的博文...
  14. 论文中的 w.r.t. 和 i.e. 是什么意思
  15. 苹果apple通过双重认证帐户恢复获取AppID访问权限
  16. Vue项目对接微信公众号踩坑日记
  17. android从入门到精通-项目实战(心得及源码)
  18. Mysql数据库---约束类型_MySQL约束类型及举例介绍
  19. python之xlrd
  20. 用CSS3制作太阳系行星运动简图

热门文章

  1. 【BUAAOO】第四次博客作业
  2. Java-杂项:Java数组Array和集合List、Set、Map
  3. [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串...
  4. 51nod 1489 蜥蜴和地下室
  5. 清除定时器 和 vue 中遇到的定时器setTimeout setInterval问题
  6. 禁用select下拉方法
  7. With(ReadPast)就不会被阻塞吗?
  8. 导入新项目报错 Hibernate提示:No generator named ID_GENERATOR is defined in the persistence unit
  9. Sasha and a Very Easy Test CodeForces - 1109E (数学,线段树)
  10. python网络数据采集(伴奏曲)