前段时间笔者开发某个项目遇到了MySQL性能问题,每张表的数据量都在五千万以上,个别表数据量甚至在一个亿以上,在开发的过程中遇到了非常多的数据库性能优化难点,笔者在开发过程中查询了很多资料,很多查询语句也在优化过程中取得了比较好的效果。笔者也将开发过程中遇到的sql优化问题总结为文章,以便日后回顾。这篇文章主要讲解mysql执行联结运算的原理。为了避免泄露公司业务及数据,在文章中涉及的sql语句都和公司业务无关。
1、MySQL使用基于成本的优化器,它将试图预测查询使用某种执行计划的成本,并从中选出成本最低的优化器。
这个当然不是乱说的,是通过计算得来的,我接下来会在文章里面告诉大家这个数据是如何计算的。
1.mysql使用B+Tree数据索引 2.B+tree在新增数据时会根据索引指定列对旧B+tree做调整 3.从物理存储结构来说,B+Tree和B-Tree都是以页的大小来划分节点大小,但是由于B+tree中中间节点不存储数据,所以在相同节点时B+tree可以存放更多key,提高查找效率 4.影响mysql查找效率的主要还是磁盘的IO次数, 大部分还是磁头到磁道花费的时间 5、myisam下存储引擎下索引和数据存储是分离的,innodb下索引和数据存储是一起的 6、innodb特性如果id不是自增序列的话,那么每次新增数据,B+tre会对索引进行重新调整浪费性能,所以尽量id使用自动序列作为索引
MySQL是一种流行的关系型数据库管理系统,广泛应用于各种场景。数据库中的数据储存在磁盘上,而MySQL使用数据页来组织和存储数据。数据页是MySQL中的关键概念,直接影响着数据库的性能和存储效率。本文将深入探讨MySQL数据页的构造和数据的组织方式,揭示数据页中数据的奥秘。
对于DBA来说Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的地址空间映射到swap上。对于频繁进行读写操作的系统而言,数据看似在内存而实际上在磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统。这篇blog主要讲讲我们作为DBA,怎样尽量避免MySQL惨遭swap的毒手。 首先我们要了解点基础的东西,比如说为什么会产生swap。假设我们的物理内存是16G,swap是4G。如果MySQL本身已经占用了12G物理内存,而同时其他程序或者系统模块又需要6G内存,这时候操作系统就可能把MySQL所拥有的一部分地址空间映射到swap上去。 cp一个大文件,或用mysqldump导出一个很大的数据库的时候,文件系统往往会向Linux申请大量的内存作为cache,一不小心就会导致L使用swap。
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第六篇,总结了MySQL的InnoDB引擎相关的实践使用问题。
背景1:查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢? 背景2:表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?
MySQL的InnoDb Buffer Pool 缓冲池是主内存中的一个区域,用来缓存InnoDB在访问表和索引时的数据。对于频繁使用的数据可以直接从内存中访问,从而加快处理速度。如果一台服务器专用作MySQL数据库使用时,通常将70%~80%(具体看总内存大小而定)的物理内存空间分配给缓冲池。
种数据库都有它自己的内存机制,如果说汽车的三大件,发动机,变速箱,底盘。数据库的内存机制算是数据库核心的核心,一个没有好的内存管理和分配的数据库,一定是不会有好的性能。
我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量:select * from table where column=xxx order by xxx limit 1,20。当数据量比较小时(100万以内),无论你翻到哪一页,性能都是很快的。如果查询慢,只要在where条件和order by 的列上加上索引就可以解决。但是,当数据量大的时候(小编遇到的情况是500万数据),如果翻到最后几页,即使加了索引,查询也是非常慢的,这是什么原因导致的呢?我们该如何解决呢?
一、背景 我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量:select * from table where column=xxx order by xxx limit 1,20。当数据量比较小时(100万以内),无论你翻到哪一页,性能都是很快的。如果查询慢,只要在where条件和order by 的列上加上索引就可以解决。但是,当数据量大的时候(小编遇到的情况是500万数据),如果翻到最后几页,即使加了索引,查询也是非常慢的,这是什么原因导致的呢?我们该如何解决呢?
我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量:
在进行慢SQL分析的时候,有时候我们会发现explain的扫描行数和慢日志中的行数相差很大,那explain中的rows这个扫描行数是怎么判断的?
我们知道MySQL在查询的时候有一种预读机制, 为了提高同样数据的查询效率,会将磁盘中的数据加载到内存中,Buffer Pool(缓冲池)就承担了这么一个角色。
MySQL在查询的时候有一种预读机制, 为了提高同样数据的查询效率,会将磁盘中的数据加载到内存中,Buffer Pool(缓冲池)就承担了这么一个角色。
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系那个的数据。这些数据具备自述性(self-describing),呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。
随着近些年来数据库技术发展演进,及国内数据库日益活跃。越来越多的企业将数据库从传统商业数据库迁移到开源或国产数据库平台。本文对比了最为常见的一种情况,从Oracle迁移到MySQL需要关注的一些差异点。这方便应用研发在迁移之初做好必要的评估备。此外,因MySQL生态发展很广泛,很多数据库产品会将MySQL作为兼容的首选。因此,很多其他类型的数据库迁移,也可以参考此文内容。
最近一直在做性能压测相关的事情,有公众号的读者朋友咨询有赞的数据库服务器有没有开启huge page,我听说过huge page会对性能有所提升,本文就一探究竟。对过程没有兴趣的可以直接看结论。
商品页面展示的数据很多,主要是商品的基本信息,比如名称颜色,商品介绍页,还有图片和视频展示,最要命的是不同类的商品的参数不同,比如电脑有内存,显卡,CPU等参数,衣服有尺码,男女等参数,口红有色号等参数
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第五篇,总结了MySQL索引相关的实践使用问题。
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
在访问数据库时,应该只请求需要的行和列。请求多余的行和列会消耗MySql服务器的CPU和内存资源,并增加网络开销。 例如在处理分页时,应该使用LIMIT限制MySql只返回一页的数据,而不是向应用程序返回全部数据后,再由应用程序过滤不需要的行。 当一行数据被多次使用时可以考虑将数据行缓存起来,避免每次使用都要到MySql查询。 避免使用SELECT *这种方式进行查询,应该只返回需要的列。
Mysql作为数据库在不同的机器和不同的业务环境中具有不同的调优方式,和我们做任何事情一样,涉及到边界确定的就是我们需要关注的。所有了解mysql实现的边界参数是我们调优的重点。
说起Linux下卸载MySQL最让人头疼,卸载不干净,会影响下一次的安装,本人最近就遇到了这个问题,下面就是我对这个问题的解决方法。
分页功能是很常见的功能,特别是当数据量越来越大的时候,分页查询是必不可少的。实现分页功能有很多种方式,如果使用的ORM框架是mybatis的话,有开源的分页插件可以使用,如:Mybatis-PageHelper。如果不使用分页插件,那么就需要手动分页了,由于不同的数据库实现分页的SQL语句并不一致,如Mysql使用的是limit关键字,而Oracle使用的是rownum,所以本文本文讲解的分页方案只适用于Mysql数据库。
2、使用了root用户登录到mysql服务器,也可以使用其他mysql用户登录。
产品反馈,用户在使用分页列表时,出现数据重复的问题,查看代码后发现对应的分页SQL并没有使用order by进行排序,但是印象中Mysql的InnoDB引擎会默认按照主键id进行排序,本地测试了一下的确出现了部分数据在不同的页都出现的问题。
2、为了支持filesort,优化器可以分配内存sort_buffer_size区域。
2、外键foreign key用于约束破坏表格的连接动作,保证两个表格的数据完整性。
客户端将查询的select sql,按照mysql通信协议传输到数据库服务。数据库服务接受查询sql,执行sql前判断要执行的sql是否是查询语句。
看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!
查看mysql中的所有库:show databases; 创建库:create database 库名称;—-》create database if not exists 库名称;如果不存在该库,则创建 删除库:drop database 库名称; 选择使用数据库:use 库名称; 显示当前使用的数据库:select database();
第5章 创建高性能的索引 并不是所有的存储引擎都用的B+数,B数能提高查询速度,但是B+树可以方便叶子节点的范围查询。 多列索引,不仅可以精确匹配最左列的数据,还能模糊匹配最左列前缀数据。 如果有某些列模糊查询了多列索引的其中一个,其后面的索引都不再生效。 哈希索引不支持范围查询也不支持排序。只支持精确查询。 innodb引擎有个特殊的功能叫“自适应哈希索引”,当innodb发现某些索引值被使用的非常频繁时,就会在内存中基于B-tree索引之上再建立一个哈希索引。 虽然存储引擎不支持哈希索引,但是我们可以自
看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!本文中有关存储引擎请查看MySQL存储引擎-InnoDB和MyISAM
这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数据文件操作,而是先对 buffer_pool 进行操作,然后再通过 checkpoint 等机制写回数据文件。占用的内存启动后就不会自动释放,默认通过LRU的算法镜像缓存淘汰,每次的新数据页,都会插入buffer pool的中间,防止前面的热数据被冲掉,长时间没动静的冷数据,会被淘汰出buffer pool,但是是被其它新数据占用了,所以一般这里不会释放的,除非重启(5.7 开始支持动态调整,默认以128M的chunk单位分配内存块)。innodb_buffer_pool主要包含数据页、索引页、undo 页、insert buffer、自适应哈希索引、锁信息以及数据字典等信息。
使用Docker拉取的Mysql并启动的Mysql容器,这个时候如果需要跳过Mysql密码验证,网上流传的最多的就是在Mysql的配置文件my.cnf中添加一行代码,但是这个仅仅是在非Docker容器运行的Mysql使用,如果你的Mysql使用的Docker容器执行的,按照网上修改并无任何作用,甚至找不到my.cnf,废话不多说看操作
看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引…或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!本文中有关存储引擎请查看MySQL存储引擎-InnoDB和MyISAM
mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf
在创建索引的时候就要考虑到关联的顺序。当表A和表B用列c关联的时候,如果优化器关联的顺序是A、B,那么就不需要在A表的对应列上创建索引。没有用到的索引会带来额外的负担,一般来说,除非有其他理由,只需要在关联顺序中的第二张表的相应列上创建索引。
mysql使用的基础规范 📷 1、InoDB必须用于表存储引擎。 2、表格字符集默认使用utf8,必要时使用utf8mb4。 3、禁止使用存储过程、视图、触发器和event。 4、禁止在数据库中存储大文件。 如照片,可以将大文件存储在对象存储系统和数据库中。 禁止在线环境进行数据库压力测试。 测试、开发、在线数据库环境必须隔离。 实例 说明: 1)通用,无乱码风险,汉字3字节,英文1字节 2)`utf8mb4` 是 `utf8` 的超集,有存储 4 字节例如表情符号时,使用它 以上就是mysql使用的基础规
看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….
查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互
前两天同事负责的订单模块查询出现了一个奇怪的问题,当加入筛选条件后会出现查询超时的问题,查询全部订单的时候没有问题,SQL如下(数据已脱敏,使用的是MySql):
1、创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。以下命令语句分别展示了如何创建主键索引(PRIMARY KEY),联合索引(UNIQUE)和普通索引(INDEX)的方法。 mysql>ALTER TABLE 表名 ADD INDEX 索引名 列名; mysql>ALTER TABLE 表名 ADD UNIQUE 索引名 列名; mysql>ALTER TABLE 表名 ADD PRIMARY KEY 索引名 列名;
左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据。如果col2是索引,查找索引为89的行元素,那么只需要查找两次,就可以获取到行元素所在的磁盘指针地址。
领取专属 10元无门槛券
手把手带您无忧上云