首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL排序内部原理探秘

    一、我们要解决什么问题 MySQL排序其实是一个老生长谈的问题了,但是我们这次想由浅入深详细的说说MySQL排序模式,怎么影响MySQL选择不同的排序模式和怎么优化排序。...同时也希望通过这篇文章解决大家的以下疑问: MySQL在哪些地方会使用排序,怎么判断MySQL使用了排序 MySQL有几种排序模式,我们可以通过什么方法让MySQL选择不同的排序模式 MySQL排序跟read_rnd_buffer_size...假设内存只有100M,但是排序的数据有900M,那么对应的外部排序算法如下: 从要排序的900M数据中读取100MB数据到内存中,并按照传统的内部排序算法(快速排序)进行排序; 将排序好的数据写入磁盘;...效率非常慢,对应可以这样来改进: 从要排序的50GB数据中读取100MB数据到内存中,并按照传统的内部排序算法(快速排序)进行排序; 将排序好的数据写入磁盘; 重复1,2两步,直到每个100MB chunk...八、MySQL排序优化总结 最后整理一下优化MySQL排序的手段 排序和查询的字段尽量少。

    2.7K72

    MySQL 5.7 内部临时表

    本文研究了在没有写查询的情况下,InnoDB行插入时,因内部临时表的问题而发生性能尖刺的情形。...在MySQL 5.7版本中,内部磁盘临时表的默认引擎是InnoDB引擎,这就意味着当SELECT操作需要在磁盘上创建临时表时(例如GROUP BY操作),就会使用到InnoDB引擎。...Krunal Bauskar曾经写过一篇关于5.7 InnoDB原生表性能的文章,InnoDB的内部临时表的操作并不会记录在redo和undo中,一般情况下相比原本MyISAM引擎的临时表性能更好点,但是仍需注意一下几点...to set the maximum size of ibtmp1 file: innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:1G (3)内部临时...这个案例要求我们要对MySQL 5.7的特性要有所注意和了解。

    6.2K10

    MySQL字段内容拆分及合并

    数据拆分及合并 需求: 使用一条SQL获得tb_user表中每个人持有的剑名(剑名用“|”分隔),即得到如下结果 拆解需求: 1) 先将tb_user表中的c_no按逗号拆分 2)将拆分后c_no中的各个...id与tb_sword中的id关联,获取剑名 3) 最后将每一个user对应的剑名合并成一个字段 分段SQL如下: 步骤1: 每一个user的c_no按逗号拆分为对应的c_id,此方法需借助于mysql.help_topic...SUBSTRING_INDEX( SUBSTRING_INDEX( a.c_no, ',', b.help_topic_id + 1 ), ',',- 1 ) c_id FROM tb_user a JOIN mysql.help_topic...-- a2表即步骤1中拆分的结果 tb_sword b2 WHERE a2.c_id =b2.id -- 关联,相当于inner join(或者join) 结果如下 步骤3: 将每个人的剑名合并为...1个字段显示,并用"|" 符合合并 SELECT a2.id,a2.name,a2.c_no, GROUP_CONCAT(b2.c_name SEPARATOR '|' ) sword_name

    3.6K30

    MySQL 内部临时表(group by工作原理)

    insert into t1 values(i, i, i); set i=i+1; end while; end;; delimiter ; call idata(); 使用内部临时表的场景...union group by union 使用内部临时表 explain (select 1000 as f) union (select id from t1 order by id desc limit...group by使用内部临时表 explain select id%10 as m, count(*) as c from t1 group by m; 通过上图可以看出,在我们进行group by...依次累加: 当碰到第一个1时,可以得出累积了X个0,结果集里面的第一行就是(0, X) 当碰到第二个2时,可以得出累积了Y个1,结果集里面的第二行就是(1, Y) InnoDB的索引就可以满足上述有序条件,MySQL...但是MySQL优化器出于对存储效率的考虑,不会使用B+数存储,而是直接使用数组。

    3.3K40

    技术分享 | MySQL 索引合并优化实践

    明明走普通索引效率更高,但是选择走了索引合并,本文就对这种索引合并的情况研究一下。...一般对于一个单表,优化器选择一个索引,但在索引合并的情况下,优化器可以使用多个索引来获取数据并对其结果进行合并。...2归并排序算法 在介绍索引合并的方式及算法前,先来简单看下归并排序算法,以可以更好地理解 MySQL 中的索引合并。...MySQL 中的索引合并 在 MySQL 中,索引合并算法有下面几种: index_merge_intersection:交集,对应执行计划 Extra:Using intersect(...)...4总结 通常情况下对于一张表的访问,MySQL 选择一个索引,在 where 条件中 range condition 满足下面条件的情况下,有可能使用到两个索引,即索引合并: 二级索引的条件满足:where

    9910

    MySQL 中 ACID 底层内部实现原理详解

    如果在回滚日志里有新增数据记录,则生成删除该条的语句 (2) 如果在回滚日志里有删除数据记录,则生成生成该条的语句 (3) 如果在回滚日志里有修改数据记录,则生成修改到原先数据的语句 第二小节:持久性的实现 先了解一下MySQL...的数据存储机制,MySQL的表数据是存放在磁盘上的,因此想要存取的时候都要经历磁盘 IO,然而即使是使用 SSD 磁盘 IO 也是非常消耗性能的。...会首先从缓冲池中读取,如果缓冲池中没有,则从磁盘读取在放入缓冲池; 写数据:会首先写入缓冲池,缓冲池中的数据会定期同步到磁盘中; 上面这种缓冲池的措施虽然在性能方面带来了质的飞跃,但是它也带来了新的问题,当MySQL...Mysql 隔离级别有以下四种(级别由低到高): READUNCOMMITED(未提交读) READCOMMITED(提交读) REPEATABLEREAD(可重复读) SERIALIZABLE (可重复读

    1.2K50

    MySQL索引优化:深入理解索引合并

    结果合并:扫描完所有选定的索引后,MySQL 将这些记录集合并,以产生最终的结果集。...MySQL可能会使用并集合并策略,分别扫描age索引和city索引,然后合并结果集,返回满足任一条件的用户记录。 3....MySQL可能会使用排序并集合并策略,分别扫描last_name索引和city索引,然后合并结果集,并按照age进行排序。...四、案例分析 以下是一个 MySQL 索引合并的案例,其中涉及到了交集合并(Intersection Merge)策略。...请注意,实际是否使用索引合并以及使用哪种类型的索引合并(交集、并集或排序并集)取决于 MySQL 优化器的决策,这基于表的统计信息、查询的具体条件以及 MySQL 配置。

    63211

    MySQL字符串的合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。...01 合并 MySQL数据库中按照指定字符合并可以直接用group_concat来实现。...默认是按照逗号进行合并的,例如: mysql> select group_concat(col1) from tb_group; +---------------------+ | group_concat...,例如指定使用 || 符号进行合并 mysql> select group_concat(col1,'||') from tb_group; +----------------------------...03 结语 本文介绍了MySQL常用的合并及拆分方法,对于擅长写SQL的同学也可以使用其他方式实现,以便解决权限不足(例如拆分时需要使用mysql库的help_topic表的权限)等情况下的需求。

    6.4K10

    Mysql专栏 - 缓冲池的内部结构(二)

    Mysql专栏 - 缓冲池的内部结构(二) 前言 这是mysql专栏的第四篇,上一个小节我们了解了如何通过flush list存储所有的脏页数据,这一节我们来继续介绍缓冲池的内部结构LRU链表。...经过上一节的讨论,当执行器发来了增删改查的请求的时候会从磁盘文件读取对应的数据块到缓冲池当中,之前提到过缓冲池不是无限的,默认情况下最多只有「128m」,一旦所有的缓存页都被加载就意味着free list内部没有空闲的缓存页...接着我们来看看,到底哪些情况下会触发MySQL的预读机制呢?...历史文章: 第一篇:Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程 - 掘金 (juejin.cn) 第二篇:Mysql专栏 - 线上调优与压力测试 - 掘金 (juejin.cn...) 上一篇:Mysql专栏 - 缓冲池的内部结构(一) - 掘金 (juejin.cn)

    69730

    Mysql专栏 - 缓冲池的内部结构(一)

    Mysql专栏 - 缓冲池的内部结构(一) Buffer pool在mysql中地位 数据页和缓存页 缓存页的描述信息 描述信息如何存放? 如何知道哪些缓存页是空闲的?...mysql怎么知道哪些页是脏页 逻辑结构和物理结构 前言 这一节我们来介绍缓冲池的内部结构。如果不清楚缓冲池是什么东西可以查看之前系列的第一篇文章。...❝缓冲池的介绍:Mysql专栏 - mysql、innodb存储引擎、binlog的工作流程#缓冲池 ❞ 概述 Buffer pool的内部结构 数据页和缓存页的关系 数据页的描述信息是什么?...其实数据库抽取了一个叫做数据页的概念,多行数据会放到一个数据页内部,磁盘中有多个页,每一个页都有很多行数据合并到一起,最终我们更新数据就是找到某一个页的某一行。...小结: 看完这篇文章相信大家有点晕了,mysql内部两个链表和一个哈希表甚至后续还会有更多的链表来维护信息,这些内容很容易混淆,所以最后再回顾前面提到的结构图来帮助读者进行回顾: 缓冲池结构图-部分

    86520

    MySQL(一)|性能分析方法、SQL性能优化和MySQL内部配置优化

    当然也对Mysql内部配置做了一些调整。 最近也在看《高性能MySQL》这本Mysql的经典书籍,很早的时候我就想写一个系列来介绍我在使用Mysql遇到的一些问题。...本文主要讲的内容包括:查看Linux系统性能的常用命令、查询与索引分析方法以及优化方式、Mysql内部配置优化。 文章内容比较干,也比较多,建议大家收藏后慢慢消化。...除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。...三、Mysql内部配置优化 安装MySQL后,配置文件my.cnf在 /MySQL安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cnf...因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。 根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

    3.1K110

    Java内部类-成员内部类、局部内部类、匿名内部类、静态内部类

    在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。...从定义的位置上看: (1)定义在外部类的方法体内/代码块 局部内部类(有类名) 匿名内部类(没有类名) (2)定义在外部类的成员位置上 静态内部类(有static修饰符) 成员内部类(没有static修饰符...) 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类的内部 成员内部类语法格式 /** * @author joshua317 */ public class Outer {//外部类...2.局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。...匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。 匿名内部类在编译的时候由系统自动起名为 Outer$1.class。

    1.2K10

    MySql基础架构(sql查询语句在MySql内部具体是怎么执行的?)

    直到有一个面试官问我一个问题,一条sql查询语句在mysql数据库中具体是怎么执行的?我被虐了,很开心,感谢他。于是开始了深入学习mysql。...本篇文章通过 一条sql查询语句在mysql数据库中具体是怎么执行的? 来具体讲解mysql的基础架构。...讲解 mysql> select * from Student where ID=1; 上面一条简单的查询语句很简单,但我想好多开发者并不知道在MYSQL内部的执行过程。...Mysql基本架构示意图 ? Mysql基本架构示意图。 从图中可以看出Mysql可以大体分为Server层和存储引擎层两部分。...如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。

    5.6K20
    领券