深入理解mysql 数据库基础概念与体系结构 数据库基础概念: 数据库是一个结构化的数据集合,可以通过一定的方式进行组织、存储和管理。 MySQL 的体系结构详解: 服务器层: 服务器层是 MySQL 的顶层,负责处理连接、查询解析、优化和执行等任务。其中,连接处理模块负责建立和维护客户端与服务器的连接。 MySQL 使用数据字典来存储这些元数据。 cp -r /var/lib/mysql /backup 恢复数据: mysql -u username -p < backup.sql 高可用性技术: 主从复制: 通过将主数据库的更改同步到从数据库, -- 主数据库 binlog_format = ROW server_id = 1 log-bin = /var/log/mysql/mysql-bin.log -- 从数据库 server_id =
结论:在执行常量等值查询时,改变索引列的顺序并不会更改explain的执行结果,因为MySQL底层优化器会自动进行优化,但还是推荐按照索引顺序列编写SQL语句。 WHERE c1='a1' AND c2='a2' AND c4>'c4' AND c3='a3' 分析:与上面explain执行结果对比,key_len=132说明索引用到了4个,因此对此SQL语句MySQL 总结: ① MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。
一、参数描述 MySQL中不同的版本优化器会有很多新特性,比如MRR、BKA等,其中optimizer_switch这个参数就是控制查询优化器怎样使用这些特性。 二、案例分析 2.1 环境描述 数据库版本MySQL5.6.35 2.2 SQL语句 image.png 2.3 分析过程 凌晨4点左右客户打来电话告知数据库查询不到数据,显得非常着急,刻不容缓
GTID的概念 何为GITD GTID(global transaction identifier)是全局事务标识符,在MySQL5.6版本中作为一个超级特性被推出。 source_id是通过使用MySQL服务的server_uuid来表示 。transaction_id 是在事务提交的时候由系统顺序分配的一个序列号。 MySQL数据库服务的uuid的查询方式。 库中新增了gtid_exectued表,在MySQL 8.0中表结构如下: (root@localhost) [(none)]> use mysql Database changed (root@localhost ) [mysql]> show create table gtid_executed \G; *************************** 1. row *******************
Mysql索引原理深入剖析 1. 索引是一种数据结构,能够提高数据的检索速度。 栗子:从如下数据中找出所有为2的数据:1,3,2,5,7,9,2,5,6? 结合上面例子可以引出索引的特点:排好序,快速查找,数据结构(mysql里面的索引index_type有btree,hash等,这些都可以理解成不同的数据结构,如btree就和数据结构中二叉树非常类似) Mysql如何管理数据库文件的? .frm文件:存储数据表的框架结构,文件名与表名相同,每个表对应一个同名frm文件,与操作系统和存储引擎无关,即不管MySQL运行在何种操作系统上,使用何种存储引擎,都有这个文件。 除了必有的.frm文件,根据MySQL所使用的存储引擎的不同(MySQL常用的两个存储引擎是MyISAM和InnoDB),存储引擎会创建各自不同的数据库文件。
作者:yandeng,腾讯 PCG 应用开发工程师 1.数据库基础 1.1 MySQL 架构 和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。 500 万并不是 MySQL 数据库的限制,过大会造成修改表结构、备份、恢复都会有很大的问题,可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小; 谨慎使用 MySQL 发送一个请求的时候,MySQL 到底做了什么: 客户端发送一条查询给服务器。 MySQL 解析器将使用 MySQL 语法规则验证和解析查询。 例如验证是否使用错误的关键字、关键字顺序、引号前后是否匹配等;预处理器则根据一些 MySQL 规则进一步解析树是否合法,例如检查数据表和数据列是否存在,解析名字和别名是否有歧义等; MySQL 根据优化器生成的执行计划
前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重。 当遇到这些问题的时候,可能会发现自己对索引还是一知半解,今天我们一起学习MySQL的索引。 一、一条查询语句是如何执行的 首先来看在MySQL数据库中,一条查询语句是如何执行的,索引出现在哪个环节,起到了什么作用。 3.5 MongoDB的索引为什么选择B树,而MySQL的索引是B+树? 因为这取决于MySQL优化器的优化策略。 当多条件联合查询时,优化器会评估哪个条件的索引效率高,它会选择最佳的索引去使用。
MySQL的二进制日志(Binary Log, Binlog)是MySQL数据库中非常核心的技术之一,它记录了数据库中所有的DDL和DML操作,对于数据的恢复、复制等都起着至关重要的作用。 今天我们将通过实际的binlog日志内容,深入探讨MySQL的binlog复制技术,理解其背后的运作机制。 /mysql-bin.000010 mysqlbinlog工具指定了起始和结束位置。 通过这段binlog日志,我们可以深入理解MySQL的binlog复制技术,以及它如何通过不同的参数和设置来保证数据的一致性和准确性。 在未来的文章中,我们将继续探讨更多关于MySQL复制和binlog技术的深入话题。
MySQL存储过程的优点 通常存储过程有助于提高应用程序的性能。当创建,存储过程被编译之后,就存储在数据库中。 但是,MySQL实现的存储过程略有不同。 MySQL存储过程按需编译。 在编译存储过程之后,MySQL将其放入缓存中。 MySQL为每个连接维护自己的存储过程高速缓存。 如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。 MySQL存储过程的缺点 如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。 不幸的是,MySQL不提供调试存储过程的功能。 开发和维护存储过程并不容易。开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能会导致应用程序开发和维护阶段的问题。 ) BEGIN SELECT count(id) from students; END;; DELIMITER ; call select_students_count(); 有参存储过程: MySQL
MySQL有很多种衍生版本,这些衍生版本支持更多不同种类的存储引擎。本文主要讨论三种MySQL引擎。 MyISAM 一种非事务性的存储引擎,是MySQL 5.5之前版本默认的存储引擎。 (二)MySQL索引类型 MySQL支持在所有关系数据库表中创建主键、唯一键、不唯一的非主码索引等多种类型的索引。此外MySQL还支持纯文本和空间索引类型。 MySQL实现 对B-树,B+树和散列等数据结构的基本概念有了一些了解之后,我们就可以开始讨论MySQL通过支持它们的存储引擎如何实现不同的算法。 $ ls -1h /var/lib/mysql/book/source_words.MY* -rw-rw---- 1 mysql mysql 9.2M 2015-05-07 19:08 MySQL免费源代码中找到,也可以查看MySQL内部手册。
本篇博客将深入探讨多表查询的相关概念、语法和实际案例,帮助读者掌握如何灵活运用多表查询来满足各种业务需求。 一.
B+树,正是MySQL的InnoDB引擎选用的数据结构,其实B+树和跳表很相似。 InnoDB为什么会选择B+树索引呢? 每个节点可以存放多条数据,这样可以有效的控制树的高度。 InnoDB的索引 MySQL的索引是在引擎层实现的,我们只介绍下InnoDB引擎下的索引。 根据主键创建的索引,我们称为主键索引或者聚簇索引;非主键创建的索引我们称为非主键索引或者二级索引。 你可能会说有些表没有主键,这个你不用担心,即使你不定义主键MySQl也会自动给每一行数据生成一个唯一ID。 每创建一个索引就对应一颗B+树。下面分别是主键索引和二级索引的示意图。 这也是MySQL的server层在选择是否使用某个索引时的一个评估点。 3. 参考资料: 《高性能MySQL》 《MySQL是怎样运行的》 MySQL官网(https://dev.mysql.com/doc/refman/5.7/en/)
在 MySQL 8.0 之前,InnoDB 锁模式默认为连续模式,值为1,而在 MySQL 8.0 之后,默认模式变成了交叉模式。至于为啥会改变默认模式,后面会讲。 交叉模式缺陷 要了解缺陷是什么,还得先了解一下 MySQL 的 Binlog。Binlog 一般用于 MySQL 的数据复制,通俗一点就是用于主从同步。 如果 MySQL 采用的格式为 Statement ,那么 MySQL 的主从同步实际上同步的就是一条一条的 SQL 语句。 其实主从同步的过程远比上图中的复杂,之前我也写过详细的MySQL主从同步的文章,感兴趣可以先去看看。 鱼和熊掌 但是如果你的 MySQL 版本仍然默认使用连续模式,但同时又想要提高性能,该怎么办呢?这个其实得做一些取舍。
一、引言MySQL 是最受欢迎的关系型数据库管理系统之一,被广泛应用于各种业务系统。主从复制是MySQL 的重要能力,用于实现数据冗余、提高可用性和性能。 了解MySQL主从复制,可以更好地管理和优化数据库,为业务系统提供更强大的支持。二、MySQL主从复制概述为什么需要主从复制主从复制是 MySQL 中一种用于实现数据冗余、提高可用性和性能的重要机制。 请注意,具体步骤可能会根据MySQL的版本和具体环境有所不同。配置主服务器 编辑MySQL配置文件:通常是my.cnf或my.ini文件,位于MySQL的安装目录下。 log_bin = mysql-bin # 启用二进制日志 重启MySQL服务:使配置生效。 创建复制账户:登录到MySQL,创建一个用于从服务器连接的复制账户。 八、常见问题与解决方法MySQL主从复制是MySQL数据库中的一种数据同步技术,它允许数据从一个MySQL数据库服务器(称为主服务器或master)复制到一个或多个MySQL数据库服务器(称为从服务器或
3 开启Binlog 3.1 查询当前 MySQL 是否支持 binlog 如下OFF代表不支持 3.2 配置 binlog 格式 修改 my.cnf 文件 查看my.cnf路径 mysql - -help --verbose | grep my.cnf 在对应的my.cnf文件中添加如下内容: 注意添加 mysqld 组 重启 MySQL 再次查看是否支持binlog 命令行修改 ,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement Binlog日志格式选择 Mysql默认是使用Statement日志格式,推荐使用MIXED. show binlog events in 'mysql-bin.000001' from 666 limit 1, 2; 7 Binlog 列说明 Event_type QUERY_ EVENT
本篇文章将深入探讨这些高级查询技巧的语法结构、分类和常见应用,帮助读者更好地理解和运用这些技巧来解决实际的数据查询问题。 一.
使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是 如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。 官网介绍:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 前提介绍:文中所有案例 mysql 版本为 5.7.23 执行计划帮助我们完成什么事情 Null explain select min(id) from t1; mysql 能够在优化阶段分析查询语句,在执行阶段不用再访问表或者索引。 因为只匹配一行数据,所以很快如将主键置于where 列表中, MySQL 就能将该查询转换为一个常量。 【两个结果 union 操作】 参考资料 https://mysql.com https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
MySQL8开始支持直方图,但实际上直方图在MySQL中,不像在其他数据库中那样有用,因为MySQL能够通过index dive,直接访问索引对应的B+树,来计算某个扫描区间内对应的索引记录条数,所以直方图不能与同一列上的索引一起使用 直方图与索引相比,优点是什么 MySQL的索引既可以有效估算索引范围内的行数,又可以帮助减少要访问的记录,为什么还要引入直方图呢? 因为MySQL认为使用index dive估算比统计信息更准确,但是当过滤的区间范围条件多,比如使用in来过滤,条目值达到1000,过滤区间就会有1000个,这样index dive的成本太高,MySQL 数据分布不均匀时,MySQL以不变应万变的处理规则,估算肯定是相当不准确的,因此在选择执行计划时就有可能做出错误的决策。 何时应该添加直方图 因为MySQL在sql优化阶段会对索引进行下潜操作来估算返回行数,导致直方图在MySQL中使用空间是有限的,那么究竟要在哪些列上创建直方图,才能有效发挥直方图的作用呢?
MySQL的InnoDB存储引擎提供了一系列的参数配置,以便数据库管理员可以根据具体的应用场景和硬件环境来优化数据库的性能。 在本文中,我们将通过SHOW STATUS LIKE 'InnoDB%'命令输出的参数,深入解析这些参数的含义和配置方法,以帮助理解如何配置MySQL InnoDB参数。 1. 这些参数是InnoDB配置和性能监控的重要组成部分,通过理解和合理配置这些参数,可以帮助数据库管理员优化MySQL数据库的性能,确保系统的稳定和高效运行。 6. 以上就是通过SHOW STATUS LIKE 'InnoDB%'命令输出参数的解析,通过理解这些参数,我们可以更好地监控和调优MySQL数据库的性能。
在 MySQL 8.0 之前,InnoDB 锁模式默认为连续模式,值为1,而在 MySQL 8.0 之后,默认模式变成了交叉模式。至于为啥会改变默认模式,后面会讲。 交叉模式缺陷 要了解缺陷是什么,还得先了解一下 MySQL 的 Binlog。Binlog 一般用于 MySQL 的数据复制,通俗一点就是用于主从同步。 如果 MySQL 采用的格式为 Statement ,那么 MySQL 的主从同步实际上同步的就是一条一条的 SQL 语句。 其实主从同步的过程远比上图中的复杂,之前我也写过详细的MySQL主从同步的文章,感兴趣可以先去看看。 鱼和熊掌 但是如果你的 MySQL 版本仍然默认使用连续模式,但同时又想要提高性能,该怎么办呢?这个其实得做一些取舍。