索引说明

InnoDB是使用B+树来实现其索引功能的。在B+树中,内节点(非叶子节点)存储了行数据的键,而叶子节点存储了所有的行数据,而B树的每个节点都存储了真实的数据。这种数据结构,决定了两者有以下不同点:

(1)非叶子节点能存放指针的数据量。因为B树的非叶子节点存放的是整行的数据,占用了较多的空间,所以能存放指针就相对较少,因此整个B树的层数就变高。当数据量比较大时,插入更新会导致维护代价也是比较大的,而且层数越高,搜索的性能就会越低。而B+树的内节点存放的是相对短很多的键值,就克服了B树遇到的问题。

(2)从数据结构上来看,B树的查询效率与数据所在的位置有关。即如果所要搜索的数据节点,在树上的位置,越靠近根节点,查询返回结果越快,最差的就是数据位于叶子节点上,不同的节点位置,其性能不均衡;而B+树,完整的数据都是在叶子节点上,其查询效率是固定的。插入、删除操作同样的原理,在B树中,其复杂度明显增加,而B+树相对简单的多。例如,B+树,在插入过程中,只需要通过在每一层搜索一个节点,依次找到节点之后,在节点处插入即可(节点满,则分裂)。

(3)B树中,所有的数据只存储了一份;而B+树,除了存储了所有数据的叶子节点外,还要在内节点存储了键值。所以,在空间占用方面,B+树会比B树多些。

(4)在一个表中,聚族索引占用的空间肯定是最大的,因为它存储了全部数据,而二级索引是建立在某几个经常查询的列上(还有用来“回表”的指针),所以,二级索引的占用空间都会比聚族索引小很多。

索引设计原则

(1)MySQL 表主键设计

INNODB 以主键排序存储;聚集索引只能是主键;存储所有数据;二级索引包含主键键值。

如果表没有定义主键,会选择第一个唯一索引(非空)作为聚集索引主键。如果唯一索引也没有,MySQL后台会自动生成RowID。

字符类型字段最好不要做主键;常见的主键有两种:自增列和UUID。

自增:  顺序存储,索引维护成本低,索引效率高;

UUID:非顺序增长,随机IO严重。

(2)索引并不是越多越好,要根据查询,有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是使用了索引还是全表扫描;

(3)应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描;

(4)值分布很稀少的字段不适合建索引,例如“性别”这种只有两三个值的字段;

(5)不用外键,由程序保证约束;

(6)尽量不用UNIQUE,由程序保证约束;

(7)使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引。

(8)排序时,排序字段需要注意index, 尤其是关联查询排序时,尽可能使用小表的字段进行排序

SQL 优化 原则

(1)避免属性隐试转换 , 如定义Moblie varchar  where Moblie =198989888会导致全表扫描;

(2)Where子句中条件字段本身避免使用函数;

(3)使用获取的必要字段代替SELECT *;

(4)批量插入,使用INSERT INTO table (col1,col2,...) VALUES (value1, value2,...),(value1, value2,...); 插入多条数据只有一次提交;

(5)避免使用长事务;

(6)禁止负向查询: NOT、!=、<>、!<、!>、NOT IN、NOT LIKE,会导致全表扫描;

(7)大表之间的join,尽量缩小结果集之后再join,否则会消耗较多的内存和CPU;

(8)搜索严禁左模糊或者全模糊(like %XX, 或like %XX%),会导致全表扫描。

MYSQL数据库索引设计的原则相关推荐

  1. mysql数据库表设计理论原则实践

    文章目录 一.理论原则 1.原始单据与实体之间的关系 2.主键与外键 3.基本表的性质 4.范式标准 5.通俗地理解三个范式 6.要善于识别与正确处理多对多的关系 7.主键PK的取值方法 8.正确认识 ...

  2. php 如何设计索引_Mysql学习浅谈mysql的索引设计原则以及常见索引的区别

    <Mysql学习浅谈mysql的索引设计原则以及常见索引的区别>要点: 本文介绍了Mysql学习浅谈mysql的索引设计原则以及常见索引的区别,希望对您有用.如果有疑问,可以联系我们. 索 ...

  3. MySQL数据库索引的最左匹配原则((a),(a,b),(a,b,c)都能用到索引,(a,c)呢?)

    MySQL数据库索引的最左匹配原则 一. 联合索引说明 二. 那ac是否能用到索引呢? 三. 思考 四. 最左匹配原则的成因 一. 联合索引说明 建立三个字段的联合索引 联合索引(a,b,c)相当于建 ...

  4. 深度解密Mysql数据库索引

    文章目录 深度理解Mysql数据库索引 Mysql索引的基本概念 索引分类 Mysql中索引的语法 创建索引 删除索引 查看表中的索引 查看查询语句使用索引的情况 索引的优缺点 优点 缺点 索引的实现 ...

  5. mysql数据库-索引基础篇

    1.索引介绍 1.索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含着对数据表里所有记录的引用指针.是一种数据结构是一种数据库系统中排序的数据结构,以协助快速查询,更新 ...

  6. mysql数据库索引页号为什么从3开始_MySQL数据库快问快答

    原标题:MySQL数据库快问快答 前言 今天楼主给大家列一下关于数据库几个常见问题的要点,如果大家对其中的问题感兴趣,可以自行扩展研究. 1. UNION ALL 与 UNION 的区别 UNION和 ...

  7. mysql索引 b树_B树与MySQL数据库索引.ppt

    B树与MySQL数据库索引 * B+树及MySQL数据库索引 厦门大学数据库实验室 罗道文 2014-08-02 ?B树以及B+树的特点以及原理 ?MySQL存储引擎MyISAM和InnoDB的B+树 ...

  8. Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别

    Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...

  9. [数据库] 一文读懂Mysql数据库索引实现原理

    咱们用了这么久Mysql数据库做项目,你知道数据是怎么存在数据库里吗?他们是如何存储的吗? 今天咱们就来扒一扒Mysql数据库索引的底层实现,Mysql数据库的索引是由都是由B+树实现的,那为什么不是 ...

最新文章

  1. Android 文本实现跑马灯效果 用自带的TextView控件
  2. 详解虚函数的实现过程之初探虚表(1)
  3. Java网页小程序——Java Applet
  4. 查看linux系统版本信息(Oracle Linux、Centos Linux、Redhat Linux、Debian、Ubuntu)
  5. sql in转换为join_同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)
  6. 标准化设计解决方案 - 标记语言和样式手册 表单
  7. SONY α系列(A6000A7)数码微单相机APP破解免付费安装教程
  8. 《Unity 3D人工智能编程》——2.2 子弹类
  9. 测开之路三十三:Flask实现扎金花游戏
  10. unable to install wkhtmltopdf with patched qt in ubuntu 16.04
  11. bmp怎么改jpg格式?
  12. ASP网站访问量计数器
  13. 一月集 一个会写诗的程序员2019
  14. Angular NgModule
  15. 模拟人工洗牌。编写一个模拟人工洗牌的程序,讲洗好的牌分别发给四个人。(c语言)
  16. Photoshop PS图层混合模式详解
  17. UDF函数和UDTF函数的图解举例,追加UDAF函数
  18. Origin制图之热力图(hot-map)
  19. POJ - 2955 Brackets (区间DP)
  20. 开发常用的Git命令

热门文章

  1. 2018 年视频监控企业竞争力分析 海康威视连续七年蝉联全球第一
  2. 机器学习——SVM之交叉验证对参数(C,gamma)进行优化以及选择
  3. Halcon例程详解(激光三角系统标定)—— calibrate_sheet_of_light_calplate.hdev
  4. mysql日期截取年月_摄影大赛丨“我遇见最美的光”第五届全国医务人员摄影大展 截稿日期2020年8月15日...
  5. 三维家可以导入别人的方案吗_广州深圳天津形位公差检测三维缺陷检测服务
  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器
  7. java mysql failover_mysqlfailover测试
  8. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
  9. 【Swift学习笔记-《PRODUCT》读书记录-实现自定义转场动画】
  10. 51nod1347(简单逻辑)