![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
MySQL
文章平均质量分 85
MySQL
sysu_lluozh
这个作者很懒,什么都没留下…
展开
-
【MySQL】性能分析Explain
一、MySQL性能优化1.1 MySQL Query Optimizer的作用MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划ps:MySQL认为最优的数据检索方式,但不见得是DBA认为是最优当客户端向MySQL请求一条Query命令解析器模块完成请求分类区别出是SELECT时并转发给MySQL Query OptimizerMySQL Query Optimizer的处理过程原创 2022-03-05 13:16:18 · 969 阅读 · 0 评论 -
【mysql】开发规范
通用命名规则本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等对象名务必只使用小写字母,下划线,数字,但首字母必须为小写字母,常规表禁止以_打头对象名长度不超过63个字符,命名统一采用snake_case禁止使用SQL保留字,使用select pg_get_keywords(); 获取保留关键字列表禁止出现美元符号,禁止使用中文,不要以pg开头提高用词品味,做到信达雅;不要使用拼音,不要使用生僻冷词,不要使用小众缩写...原创 2021-06-02 08:48:58 · 117 阅读 · 0 评论 -
【MySQL45讲】insert语句锁的优化
MySQL对自增主键锁做了优化,尽量在申请到自增id以后,就释放自增锁insert语句是一个很轻量的操作,不过,这个结论对于"普通的insert语句"才有效,也就是说,还有些insert语句是属于特殊情况的,在执行过程中需要给其他资源加锁,或者无法在申请到自增id以后就立马释放自增锁接下来聊聊这个话题一、insert … select语句表t和t2的表结构和初始化数据语句如下:表结构语句:CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREME原创 2021-05-31 23:57:46 · 671 阅读 · 2 评论 -
【MySQL45讲】join语句优化
在实际生产中,关于join语句使用的问题,一般会集中在以下两类:dba不让使用join,使用join有什么问题呢?如果有两个大小不同的表做join,应该用哪个表做驱动表呢?接下来先说说join语句到底是怎么执行的,然后再来回答这两个问题为了便于量化分析,创建两个表t1和t2来说明CREATE TABLE `t2` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KE原创 2021-05-31 08:46:24 · 267 阅读 · 0 评论 -
【MySQL45讲】查询是否把数据库内存打爆
主机内存只有100G时,现在要对一个200G的大表做全表扫描,会不会把数据库主机的内存用光了?这个问题确实值得担心,被系统OOM(out of memory)可不是闹着玩的但是,反过来想想,逻辑备份的时候,可不就是做整库扫描吗?如果这样就会把内存吃光,逻辑备份不是早就挂了?所以说,对大表做全表扫描,看来应该是没问题的但是,这个流程到底是怎么样的呢?一、全表扫描对server层的影响1.1 全表扫描操作假设,现在要对一个200G的InnoDB表db1. t,执行一个全表扫描当然,要把扫描结果保原创 2021-05-29 13:40:27 · 1009 阅读 · 2 评论 -
【MySQL45讲】主备延迟导致读写分离的问题
一主多从架构应用场景的读写分离时,应该怎么处理主备延迟导致的读写分离问题呢?一、读写分离的架构读写分离的主要目标是分摊主库的压力,接下来看看两种读写分离的架构1.1 客户端直连上图中的结构是客户端(client)主动做负载均衡,这种模式下一般会把数据库的连接信息放在客户端的连接层,也就是说,由客户端来选择后端数据库进行查询1.2 proxy代理还有一种架构是,在MySQL和客户端之间有一个中间代理层proxy,客户端只连接proxy, 由 proxy根据请求类型和上下文决定请求的分发路由1原创 2021-05-29 00:39:27 · 731 阅读 · 4 评论 -
【MySQL45讲】提升性能的临时方案
业务高峰期,生产环境的MySQL压力太大,没法正常响应,需要短期内临时性地提升一些性能接下来看看这些临时方案,并着重说说可能存在的风险一、短连接风暴正常的短连接模式就是连接到数据库后,执行很少的SQL语句就断开,下次需要的时候再重连如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况1.1 短连接成本MySQL建立连接的过程,成本是很高的,除了正常的网络连接三次握手外,还需要做登录权限判断和获得这个连接的数据读写权限在数据库压力比较小的时候,这些额外的成本并不明显但是,短连原创 2021-05-28 23:30:02 · 633 阅读 · 0 评论 -
【MySQL45讲】查一行数据执行慢分析
一般情况下,如果提及查询性能优化,肯定会先想到一些复杂的语句,想到查询需要返回大量的数据,但有些情况下,查一行数据也会执行得特别慢接下里看看什么情况下会出现查一行数据执行慢的现象需要说明的是,如果MySQL数据库本身就有很大的压力,导致数据库服务器CPU占用率很高或ioutil(IO利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于接下来的讨论范围为了便于描述,还是构造一个表,基于这个表来说明问题,这个表有两个字段id和 c,并且在里面插入了10万行记录mysql> CREATE原创 2021-05-28 00:17:01 · 230 阅读 · 0 评论 -
【MySQL45讲】破坏索引有序性的操作
在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句,对这些语句使用不当的话,会不经意间导致整个数据库的压力变大接下来分享三个案例,在遇到相似的问题时,可以举一反三的快速解决问题一、条件字段函数操作1.1 需求背景假设现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段,为了便于描述,先忽略其他字段这个表的建表语句如下:mysql> CREATE TABLE `trade原创 2021-05-27 00:08:17 · 419 阅读 · 1 评论 -
【MySQL45讲】order by工作机制
在开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求以前面举例用过的市民表为例,假设要查询城市是"杭州"所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄这个表的部分定义如下:CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEF原创 2021-05-26 00:03:00 · 234 阅读 · 2 评论 -
【MySQL45讲】count(*)慢的问题
在开发系统的时候,经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数这时候可能会想,一条select count(*) from t语句不就解决了吗?但是,发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。但记个总数,每次要查的时候MySQL直接读出来,不就好了么,为什么这么慢?接下来聊聊count(*)语句是怎样实现的,以及MySQL为什么会这么实现接着聊聊应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么做一、count(*)的实现方式1.1 不同引擎的实现要原创 2021-05-20 08:38:20 · 3112 阅读 · 4 评论 -
【MySQL45讲】删掉表数据但表文件大小不变
出现这样的场景,数据库占用空间太大,把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?接下来聊聊数据库表的空间回收,看看如何解决这个问题这里,针对MySQL中应用最广泛的InnoDB引擎展开讨论一个InnoDB表包含两部分,即:表结构定义数据在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里,而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了因为表结构定义占用的空间很小,所以接下来主要讨论的是表数据接下来,首先说明为什么简单地删除表数据达不到表原创 2021-05-20 00:21:59 · 316 阅读 · 0 评论 -
【MySQL45讲】MySQL执行时间抖动
平时的工作中,可能遇到过这样的场景,一条SQL语句正常执行的时候特别快,但有时不知道咋回事变得特别慢,且这样的场景很难复现,不只随机且持续时间还很短看上去,这像是数据库"抖"了一下,接下来看看这是什么原因引起一、案例类比1.1 账本更新InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作,这个日志叫作redo log(重做日志),在更新内存写完redo log后,就返回给客户端,本次更新成功做下类比的话,《孔乙己》里咸亨酒店掌柜记账的账本是数据文件,记账用的粉板是日志文件(redo log原创 2021-05-19 23:47:16 · 211 阅读 · 0 评论 -
【MySQL45讲】字符串字段加索引
几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是接下来要讨论的问题一、栗子假设,现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64), ... )engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句: select f1, f2 from SUser where email='x原创 2021-05-19 00:22:20 · 612 阅读 · 2 评论 -
【MySQL45讲】MySQL选错索引
在MySQL中一张表其实是可以支持多个索引的,但是在写SQL语句的时候,并没有主动指定使用哪个索引,也就是说,使用哪个索引是由MySQL 来确定的有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于MySQL选错了索引,而导致执行速度变得很慢?一、栗子接下来看一个例子建一个简单的表,表里有a、b两个字段,并分别建上索引:CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFA原创 2021-05-14 00:16:24 · 696 阅读 · 0 评论 -
【MySQL45讲】唯一索引和普通索引的选择
一、案例背景针对唯一索引和普通索引的区别,在不同的业务场景下,应该选择普通索引,还是唯一索引?假设在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL语句:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所以,一定会考虑在id_card字段上建索引由于身份证号字段比较大,不建议把身份证号当做主键,那么现在有两个选择:原创 2021-05-11 00:11:59 · 651 阅读 · 0 评论 -
【MySQL45讲】事务隔离性
一、问题在【MySQL45讲】事务隔离级别中提到,可重复读隔离级别,事务T启动时创建一个视图read-view,之后事务T执行期间,即使有其他事务修改了数据,事务T看到的仍然跟在启动时看到的一样也就是说,一个在可重复读隔离级别下执行的事务不受外界影响但在【MySQL45讲】行锁中又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它会被锁住,进入等待状态问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,此时读到的值是什么呢?二、栗子2.1 表初始化语句原创 2021-04-30 00:16:44 · 719 阅读 · 0 评论 -
【MySQL45讲】行锁
一、支持行锁的引擎1.1 什么是行锁顾名思义,行锁就是针对数据表中行记录的锁,比如:事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新MySQL的行锁是在引擎层由各个引擎自己实现,但并不是所有的引擎都支持行锁1.2 MyISAM不支持行锁不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度1.3 InnoDB支持行锁这也是MyISAM被InnoDB替代的重要原因之一二、两阶段锁如果对原创 2021-04-29 00:26:10 · 208 阅读 · 0 评论 -
【MySQL45讲】全局锁和表锁
数据库锁设计的初衷是处理并发的问题,做为多用户共享的资源,当发现并发访问的时候,数据库需要合理地控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构根据加锁的范围,MySQL里面的锁大致可以分成:全局锁表级锁行锁接下来主要分析全局锁和表级锁,由于锁的设计比较复杂,所以不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理一、全局锁1.1 全局锁命令顾名思义,全局锁就是对整个数据库实例加锁MySQL提供了加全局读锁的方法,命令是:Flush tables with原创 2021-04-28 00:00:53 · 210 阅读 · 0 评论 -
【MySQL45讲】深入浅出索引(下)
一、回表1.1 表结构表T的初始化语句mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '',index k(k))engine=InnoDB;insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg'原创 2021-04-27 00:42:34 · 170 阅读 · 0 评论 -
【MySQL45讲】深入浅出索引(上)
一句话简单来说,索引的出现其实就是为了提高数据查询的效率像书的目录一样,一本 500页的书,如果想快速找到其中的某一个知识点,在不借助目录的情况下,那估计可得找一会儿,同样,对于数据库的表而言,索引其实就是它的"目录"一、索引的常见模型索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里引出了索引模型的概念可以用于提高读写效率的数据结构有很多,接下来看看三种常见也相对简单的数据结构,分别是哈希表、有序数组和搜索树从使用的角度,简单分析这三种模型的区别1.1 哈希表一种以键-值对原创 2021-04-24 00:20:50 · 222 阅读 · 2 评论 -
【MySQL45讲】事务隔离级别
一、前言1.1 现实案例你要给朋友小王转100块钱,而此时你的银行卡只有100块钱转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的不然等程序查完之后,还没做减法之前,你这100块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时要用到"事务"这个概念1.2 MySQL事务简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败在MySQL中,事务支持是在引擎层实现,但是MySQL是一个支持多原创 2021-04-23 00:18:30 · 202 阅读 · 0 评论 -
【MySQL45讲】一条SQL更新语句如何执行
一、前言一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎dba经常说:MySQL可以恢复半个月内任意一秒的状态,惊叹的同时,是不是好奇这是怎么做到?接下来我们从一个表的一条更新语句看看这究竟如何做到的下面是这个表的创建语句,这个表有一个主键ID和一个整型字段c:mysql> create table T(ID int primary key, c int);如果要将ID=2这一行的值加1,SQL语句就会这么写:mysql> update T原创 2021-04-20 23:58:32 · 167 阅读 · 0 评论 -
【MySQL45讲】一条SQL查询语句如何执行
有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句:mysql> select * from T where ID=10;输入一条语句,返回一个结果,那这条语句在MySQL内部的执行过程是怎么样的呢?一、MySQL基本架构示意图从中可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程二、MySQL架构分层大体来说,MySQ分为Server层和存储引擎层两部分Server层包括连接器、查询缓存、分析器、优化器、执行器等涵盖MySQL的大多数核心服务功能,以及所有原创 2021-04-14 08:36:33 · 193 阅读 · 0 评论 -
【mysql】分组排序赋值
在实现接口平台功能时,有一个这样都场景:分组下的元素可以进行拖拽移动到该分组任意位置或者其他分组任意位置每个分组下面所有的元素都有一个排序序号,针对元素移动时:对原有分组下所有元素进行重新排序对新加入对分组所有元素进行插入排序为了更好对说明,我们创建一张这样对表CREATE TABLE component (c_id varchar(100), group_id varchar(20), c_index int);INSERT INTO component VALUES ('60ff7原创 2020-07-10 20:19:36 · 1636 阅读 · 0 评论 -
【mysql】查询返回int数据为空时处理
使用MyBatis查询,返回类型为int,但是当查询结果为空null,出现异常如代码中xml文件查询语句<select id="getGenerateStatus" resultType="java.lang.Integer"> select is_generating from report_info where task_id = #{taskId}</select>当未查询到任原创 2020-07-02 13:40:31 · 3365 阅读 · 0 评论 -
【postgresql】数据聚合之PERCENTILE_CONT
在实现性能测试报告聚合的时候,一开始使用的方案是通过数据库查询load出所有数据,然后不同维度数据不同消费者消费聚合对应的数据,这样实现当数据量超过1000w+时下载速度无法解决因为使用的数据库是TimescaleDB,可以使用数据库直接聚合数据的方式Aggregate FunctionsPostgreSQL提供了一系列的 聚合方法其中我们可以找到有序集合聚合函数PERCENTILE_CONTERCENTILE_CONT 在对值进行排序后计算值之间的线性内插PERCENTILE_CONT原创 2020-07-02 09:27:53 · 2694 阅读 · 0 评论 -
【mysql】大数据量数据读取
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询数据准备表名:report_sample描述:获取执行性能报告数据主要字段:task_id, seconds, elapsed字段情况:该表10个字段数据量:1000w+一次查询出所有记录不使用分页查询的情况下,一次查询出表中的所有记录,也就是全表扫描select count(*) from report_sample where task_id =原创 2020-07-02 09:24:28 · 1384 阅读 · 1 评论 -
【mysql】rollup 统计集合
数据汇总在使用TimescaleDB数据库并做数据聚合时SELECT labels, count(*) as sample_count, avg(elapsed) as elapsed_avg, percentile_cont(0.5) WITHIN GROUP (ORDER BY elapsed) as elapsed_50pcFROM report_sampleWHERE task_id = '63e26fe1821d45原创 2020-07-01 21:24:21 · 1878 阅读 · 0 评论 -
【mysql】mysqldb Windows安装
针对数据验证的项目,计划使用python实现一个sql查询原始数据验证数据正确性的小工具原本电脑中有python2.7,现在得下载mysqldb模块,下载路径可在http://www.codegood.com/downloads,下载了MySQL-python-1.2.3.win-amd64-py2.7版本接下来开始进行安装,点击安装出现了问题搜索一下 Python version 2.7 requ原创 2017-05-03 10:29:25 · 424 阅读 · 0 评论 -
【mysql】删除重复数据
用例执行每次产生一条record日志信息,累积下来执行的日志信息海量,需要定期清理日志信息仅剩下最新的一条即可数据库表结构简化版idin_idcase_idinfo即删除重复记录,保存Id最大的一条DELETE FROM logrecordWHERE id in (SELECT id FROM logrecord GROU...原创 2019-12-17 16:06:12 · 494 阅读 · 0 评论 -
【mysql】Incorrect string value 中文乱码
接口平台用户反馈一个问题。及执行测试计划后测试计划列表中并没有显示该执行的测试计划。发现又又又出现了mysql数据库字段长度限制的问题 File "/app/httpRequest/controller/controller.py", line 121, in _execute_one_case series_case['case_type'])pymysql.err.DataErro...原创 2019-10-25 19:13:57 · 757 阅读 · 0 评论 -
【mysql】concat及group_concat
在mysql中使用concat和group_concat查询,遇到一些坑,mark一下首先看看concat和group_concat分别有什么作用concat()函数功能:将多个字符串连接成一个字符串。语法:concat(str1, str2,…)实际栗子SELECT * FROM iv WHERE concat(projec_name,projectid,name) LIKE '%s...原创 2019-10-16 20:20:09 · 428 阅读 · 0 评论 -
MySQL日志
MYSQL里的日志主要分为4类,使用这些日志文件,可以查看MYSQL内部发生的事情。分别是1、错误日志:记录mysql服务的启动、运行、停止mysql服务时出现的问题2、查询日志:记录建立的客户端连接和执行的语句3、二进制日志:记录所有更改数据的语句,可以用于数据复制4、慢查询日志:记录所有执行时间超过long_query_time的所有查询或不使用索引的查询默认情况下,所有日志创建于mysql数据转载 2015-10-14 17:28:07 · 436 阅读 · 0 评论 -
Mysql创建后表的修改
创建后表的修改alter table 语句用于创建后对表的修改, 基础用法如下:添加列基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];示例:在表的最后追加列 address: alter table students add address char(60);在名为转载 2015-10-08 20:45:32 · 413 阅读 · 0 评论 -
操作MySQL数据库
操作MySQL数据库向表中插入数据insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);其中 [] 内的内容是可选的, 例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:inse转载 2015-10-08 20:50:01 · 330 阅读 · 0 评论 -
由浅入深探究 MySQL索引结构原理、性能分析与优化
第一部分:基础知识:索引官方介绍索引是帮助MySQL高效获取数据的数据结构。笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料。关键字index————————————————————-唯一索引强调唯一,就是索引值必须唯一,关键字unique index创建索引:1、create unique ind转载 2015-10-14 17:30:52 · 399 阅读 · 0 评论 -
Servlet学习
1.什么是servlet? Servlet是一种服务器端的Java应用程序,Server + Applet =Servlet 意为服务器端的小程序,具有独立于平台和协议的特性,可以生成动态的Web页面 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从转载 2015-10-14 09:32:04 · 339 阅读 · 0 评论 -
触发器与存储过程的区别
触发器原理: 触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。 触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVE转载 2015-10-13 12:55:30 · 735 阅读 · 0 评论 -
apache tomcat nginx的区别
先说Apache和Tomcat的区别:Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。 在Apache基金会里面ApacheServer永远会被赋予最大的支持,毕竟大儿子最亲嘛,而Apache的开源服务器软件Tomcat同样值得关注,毕竟Tomcat是开源免费的产品,用户会转载 2015-10-10 10:57:41 · 511 阅读 · 0 评论