热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql一对多根据多条数据排序_后台需要掌握的mysql优化

先从索引结构说:mysql的索引结构是BTree-非叶子节点不存储指针;-叶子节点存储数据;-mysql的b树叶子节点有双向指针ÿ

先从索引结构说:

mysql 的索引结构是 B+Tree

- 非叶子节点不存储指针;

- 叶子节点存储数据;

- mysql 的 b+树 叶子节点有双向指针(适合范围查询);

12cd7b3b3d6b6a262563e81e7f516ab5.png
InnoDB主键索引
fa57c340328d7fb3e5f3ce4460378cd2.png
MyISAM索引

不同存储引擎 索引结构有点不同,

MyISAM 索引(主键和非主键)叶子节点存储记录所在页的指针,这种索引为非聚簇索引;

InnoDB 主键索引叶子节点存储完整的数据记录,这种索引为聚簇索引,非主键索引叶子节点存储主键值(节省空间,以防数据修改时维护困难);

InnoDB 必须含有主键索引(如果没有,innodb会自己新建一个),并且建议主键索引为自增主键(节省存储空间,插入的时候排序和分页也方便);

InnoDB 支持事务,使用的锁粒度为行级锁。

explian 列的信息的含义:

1. id 列,id列越大执行优先级越高,id相同从上往下执行,id为null最后执行;

2.select_type 列,表示对应行是简单还是复杂的查询(复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。)

3.table列, 这一列表示 explain 的一行正在访问哪个表。

当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。

当有 union 时,UNION RESULT 的 table 列的值为,1和2表示参与 union 的 select 行id。

4. type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。

依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL

1)system为const1个特例,即表中只有1条记录。这个是及特殊的情况

2)const , explain select * from h_user_info where id = 112;

c0ccb1cf0fb37f25e530d52e4332b6f5.png
const是在where条件以常量作为查询条件,与primary key 或 unique key 比较,表中最多有1条记录匹配。由因而常量,所以实际上只需要读1次。

3)eq_ref , explain SELECT * from b_user_info a LEFT JOIN b_device_info b on a.udid = b.udid

c9e39165c03944e3282c6ebf75311872.png
primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。

4) ref, EXPLAIN SELECT * from b_order_info a LEFT JOIN b_user_info b on a.phone = b.phone

3c5f7bcd40b7494d3baab70a8baf9208.png
与上面的相比在于连接的列 索引为普通索引,会找到多条记录,select phone from b_user_info where phone = '15636985214' 也会出现这个情况

5)range, EXPLAIN SELECT * from b_order_info where order_id > 2

d4491e8f5feb9c46ecbebb154228ff13.png
范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。

6) index

7) all, 全表扫描,mysql需要从头到尾去查找所需要的行。

5.possible_keys列

这一列显示查询可能使用哪些索引来查找。

explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。

6. key 列

这一列显示mysql实际采用哪个索引来优化对该表的访问。

如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

7. key_len 列

这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。如果字段允许为 NULL,需要1字节记录是否为 NULL

8.ref

在使用索引时,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)

9.rows 列

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

10.Extra列

1)Using index

查询的列被索引覆盖,并且where筛选条件是索引的前导列,是性能高的表现。一般是使用了覆盖索引(索引包含了所有查询的字段)。

2)Using where:查询的列未被索引覆盖,where筛选条件非索引的前导列

3)Using where Using index:查询的列被索引覆盖

explain SELECT user_id from b_user_info where user_id > 200

72c897adbf4a1ac6720ec9c841cb851a.png

4)Using temporary:mysql需要创建一张临时表来处理查询。

5)NULL:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引

6)Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。



推荐阅读
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
踏实小青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有