Mysql-基础知识
文章平均质量分 68
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
count(1) 与count(*) 的性能比较【官网】
参考官网:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.htmlcount(1) 与count(*) 的性能count(expr)count聚合函数统计返回expr表达式值不为Null的行数,返回值为bigint。如果没有匹配到任何行数,则返回0。但是count()又有些不同,count()整张表的行数,不论是否列为Null。myIsammyIsam存储引擎查询count()是非常快速的,因为myIsam独立维护转载 2021-02-09 11:30:27 · 360 阅读 · 0 评论 -
【开发规约】MySQL规范
规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建表语句、错误 SQL、错误的索引有积极的意义,故分享出来给大家参考。下边分为建表规约、SQL 规约、索引规约三个部分,每部分的每一条都有强制、建议两个级别,大家在参考时,根据自己公司的情况来权衡。建表规约【强制】:①存储引擎必须使用 InnoDB解读:InnoDB 支持事物、行级锁、并发性能更好,CPU 及内存缓存页优化使得资源利用率更高。【强制】:②每张表必须设置一个主键 ID,且这个主键 ID 使用自增主键(在转载 2020-11-15 16:15:06 · 637 阅读 · 2 评论 -
MySQL之BLGC介绍
一、组提交介绍1.1 什么是组提交Binary Log Group Commit 即二进制日志组提交。这是 MySQL5.6 版本中引进的一个新的特性。为什么需要引进这个特性呢?我们知道当我们把 MySQL 的 binlog 开启的时候,MySQL 会将每个事务的操作都记录到 binlog 中,方便我们使用 binlog 来完成复制或者恢复操作。可是需要调用fsync()才能将缓存中被更改的 binlog 真正的写到磁盘上,保证数据的持久化。但是这是一个从内存写到磁盘的过程,I/O 比较慢。如...转载 2020-09-13 08:34:01 · 1550 阅读 · 0 评论 -
【mysql】关于checkpoint机制
一、简介思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕机发生的时刻。但是这需要两个前提条件:1、缓冲池可以缓存数据库中所有的数据;2、重做日志可以无限增大因此Checkpoint(检查点)技术就诞生了,目的是解决以下几个问题:1、缩短数据库的恢复时间;2、缓冲池不够用时,将脏页刷新到磁盘;3、重做日志不可用时,刷新脏页。 当数据库发生宕机时,数据库不需要重做转载 2020-08-22 12:56:04 · 1022 阅读 · 0 评论 -
MySQL中binlog和redo log的一致性问题
MySQL中binlog和redo log的一致性问题本人目前在从事MySQL内核的开发和维护工作,以后会写一些MySQL的知识分享。关于MySQL中binlog和redo log的一致性问题,在网上看过一些文章,感觉不是特别清楚,所以自己总结后和大家分享一下,文章如有问题,欢迎指教。redo log 和 binlogredo log在MySQL InnoDB中,redo log是用来实现事务的持久性,即当事务在提交时,必须先将该事务的所有操作日志写到磁盘上的 redo log file进转载 2020-08-22 12:31:57 · 754 阅读 · 0 评论 -
mysql事务、redo日志、undo日志、checkpoint详解
转载:https://zhuanlan.zhihu.com/p/34650908事务: 说起mysql innodb存储引擎的事务,首先想到就是ACID(不知道的请google),数据库是如何做到ACID的呢?举个例子: 数据库数据存放的文件称为data file;日志文件称为log file;数据库数据是有缓存的,如果没有缓存,每次都写或者读物理disk,那性能就太低下了。数据库数据的缓存称为data buffer,日志(redo)缓存称为log buffer;既然数据库数据有缓...转载 2020-08-22 11:27:16 · 657 阅读 · 0 评论 -
MySQL中的semi-join
http://www.linuxidc.com/Linux/2015-05/117523.htmhttps://cloud.tencent.com/developer/article/14277021. 背景介绍什么是semi-join?所谓的semi-join是指semi-join子查询。 当一张表在另一张表找到匹配的记录之后,半连接(semi-jion)返回第一张表中的记录。与条件连接相反,即使在右节点中找到几条匹配的记录,左节点 的表也只会返回一条记录。另外,右节点的表一条记录也不会返回。转载 2020-08-04 14:18:30 · 710 阅读 · 0 评论 -
mysqlbinlog 工具分析binlog日志
MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中;当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步数据;和SQL SERVER 数据库开启完整模式的原理一样,每一次的数据的变动都会记录在案;(对数据库的select,show这些操作不会记录在binlog)下面介绍mysqlbinlog工具查看 二进制日志内容;检查工作:1,查看是否开启binlogshow variables like转载 2020-06-12 16:22:17 · 962 阅读 · 0 评论 -
Mysql的binlog开启
1.登陆MySQL查看日志状态# mysql -u root -p123456mysql> show variables like '%log_bin%';2.退出MySQL登陆mysql> exit3.修改配置文件# vi /etc/my.cnf行尾加上server-id=1log-bin=/var/lib/mysql/mysql-binserver-id :表示单个结点的id,单个节点可以随意写,多个节点不能重复,log-bin指定转载 2020-06-12 16:22:20 · 772 阅读 · 0 评论 -
binlog三种模式的区别(row,statement,mixed)
binlog模式分三种(row,statement,mixed)1.Row日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况。优点:在row模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了,所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程和function,以及trigger的调转载 2020-06-11 18:33:43 · 1205 阅读 · 0 评论 -
redo和undo日志
在数据库系统中,既有存放数据的文件,也有存放日志的文件。日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件。 MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。1 undo1.1 undo是啥undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name=’B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name=’B’的记录,如果这个修改出现异常,可以使用undo日转载 2020-06-09 12:42:10 · 709 阅读 · 0 评论 -
redo和undo区别讨论及何时写入,InnoDB undo, redo,binlog,data什么时候写?
undo:相当于数据修改前的备份redo: 相当于数据修改后的备份,为了保证事务的持久化,redo会一直写Undo + Redo事务的简化过程 假设有A、B两个数据,值分别为1,2. A.事务开始. B.记录A=1到undo log. C.修改A=3. D.记录A=3到redo log. E.记录B=2到undo log. F.修改B=4. G.记录B=4到redo log. H.将redo log写入磁盘 I.事务提交完成-Undo + Redo事务的...转载 2020-06-09 12:16:54 · 4229 阅读 · 0 评论 -
什么是WAL?Write-ahead logging
什么是WAL"In computer science, write-ahead logging (WAL) is a family of techniques for providing atomicity and durability (two of the ACID properties) in database systems."——维基百科在计算机领域,WAL(Write-ahead logging,预写式日志)是数据库系统提供原子性和持久化的一系列技术。在使用WAL的系统中,所有的修改转载 2020-06-09 11:15:46 · 1000 阅读 · 0 评论 -
什么是 WAL?Write-ahead logging
什么是 WALWAL(Write Ahead Log)预写日志,是数据库系统中常见的一种手段,用于保证数据操作的原子性和持久性。在计算机科学中,「预写式日志」(Write-ahead logging,缩写 WAL)是关系数据库系统中用于提供原子性和持久性(ACID 属性中的两个)的一系列技术。在使用 WAL 的系统中,所有的修改在提交之前都要先写入 log 文件中。log 文件中通常包括 redo 和 undo 信息。这样做的目的可以通过一个例子来说明。假设一个程序在执行某些操作的过程中机器掉电转载 2020-06-09 11:02:59 · 1615 阅读 · 0 评论 -
mysql自增id超大问题查询(REPLACE INTO、ON DUPLICATE KEY UPDATE)
引言小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入就会失败,balabala......”我记得没有这么多,最多1k多万,count了下,果然是1100万。原来运维是通过auto_increment那个值看的,就是说,表中有大量的删除插入操作,但是我大部分情况都是更新的,怎么会这样?问题排查这张表是一个简单的接口服务在使用,每天大数据会统计一大批信息转载 2020-06-01 17:46:06 · 1026 阅读 · 0 评论 -
MySQL-CPU消耗过大的优化方案
谁在消耗cpu?用户+系统+IO等待+软硬中断+空闲祸首是谁?1、用户 用户空间CPU消耗,各种逻辑运算2、IO等待 等待IO请求的完成产生影响用户和IO等待消耗了大部分cpu吞吐量下降(tps) 查询响应时间增加 慢查询数增加 对mysql的并发陡增,也会产生上诉影响如何减少CPU消耗?1、减少等待减少IO量 ,SQL/index,使用合适的索引减少扫描的行数(需平衡索引的正收益和维护开销,空间换时间)提升IO处理能力, 加cache/加磁盘/SS转载 2020-05-09 17:28:08 · 646 阅读 · 0 评论 -
【重要】MySQL中order by语句的实现原理以及优化手段
相信很多人在面试过程中,总被问到有没有 SQL 调优经验,对于工作经验年限较少的求职者,通常都是在面试之前从网上百度一些答案,提前背熟,然后面试的时候直接将提前背好的答案说出来。笔者作为一名菜鸟,在刚满一年工作经验的时候,出去面试,就是这么干的。记得去某家公司面试的时候,被面试官问到 order by 在排序的时候执行较慢,这个时候该如何优化?我当初想都没想,就回答说给 order by 子句中的...转载 2020-04-30 18:38:43 · 924 阅读 · 0 评论 -
MySQL中将一列以逗号分隔的值行转列
前言 有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值。如下表pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末)得到所有的不重复的值,如value AT BT CT DT ET SQL如下:select disti...转载 2020-01-07 12:30:08 · 5121 阅读 · 0 评论 -
MySQL删除重复数据只保留最新的一条
MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题。案例描述:按天删除表中重复数据只保留最新的一条(这里按照id越大,数据越新),注意,一天中可能出现多条数据。重复数据以name为准,即name相同视为重复案例表结构和数据CREATE TABLE `test` ( `id` in...转载 2019-10-29 15:54:45 · 1557 阅读 · 0 评论 -
MySQL 中通过使用UNIQUE KEY 来控制字段值不重复的问题.
语法:UNIQUE KEY `test` (`xref_key`,`xref_dbname`)UNIQUE KEY `xref_key` (`xref_key`,`xref_dbname`) 上述语法检查xref_key与xref_dbname的组合是否是唯一值,可以设定多个字段的组合。其中,test是索引表中的字段名称。 该方法适合用来解决多个字段相转载 2015-05-31 11:31:53 · 8105 阅读 · 0 评论 -
MySQL日期数据类型、时间类型使用总结
MySQL 日期类型:日期格式、所占存储空间、日期范围 比较。 日期类型 存储空间 日期格式 日期范围 ------------ --------- --------------------- ----------------------------------------- datetime 8 bytes转载 2015-05-31 12:07:11 · 1138 阅读 · 0 评论 -
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'title' at row 1
做实验用到wiki的数据,想要把xml格式的内容转存到数据库中,结果碰到了好多问题。com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'title' at row 1从页面上输入中文保存到MySQL数据库时候就会出现上面的问题,并且输入的中文不是过长。这种情况下应该是字符集的问转载 2015-05-22 13:02:26 · 2998 阅读 · 0 评论 -
MySQL单列索引和联合索引
MySQL单列索引和联合索引所有的MySQL列类型能被索引。在相关的列上的使用索引是改进SELECT操作性能的最好方法。一个表最多可有16个索引。最大索引长度是256个字节,尽管这可以在编译MySQL时被改变。对于CHAR和VARCHAR列,你可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。在CREATE TABLE语句中索引列前缀的语法看起来像这样:转载 2015-06-03 13:10:28 · 2117 阅读 · 0 评论 -
MySQL索引之前缀索引和索引选择性
有时需要索引很长的字符列,它会使索引变大而且变慢。一个策略就是模拟哈希索引。但是有时这也不够好,那?通常可以索引开始的几个字符,而不是全部值,以节约空间并得到好的性能。这使索引需要的空间变小,但是也会降低选择性。索引选择性是不重复的索引值和表中所有行的比值。高选择性的索引有好处,因为它使mysql在查找匹配的时候可以过波掉更多的行。唯一索引的选择率为1,为最佳值。如果索引BLOG和转载 2015-06-03 13:09:52 · 1142 阅读 · 0 评论 -
mysql or条件可以使用索引而避免全表
在某些情况下,or条件可以避免全表扫描的。1 .where 语句里面如果带有or条件, myisam表能用到索引, innodb不行。1)myisam表: CREATE TABLE IF NOT EXISTS `a` ( `id` int(1) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `aNum` ch转载 2015-07-02 21:49:32 · 4689 阅读 · 0 评论 -
Mysql有效索引和无效索引的介绍
Mysql有效索引和无效索引的介绍标签: Mysql 索引内容转自前往1.索引可能失效的场景1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引3.在JOIN操作中(需要从多个转载 2015-07-02 21:50:37 · 3464 阅读 · 0 评论 -
MySQL何时使用索引 何时不使用索引
MySQL何时使用索引 对一个键码使用>, >=, =, SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5; SELECT * FROM table_name WHERE key_part1 IS NULL; 当使用不以通配符开始的LIKE SELECT * FRO转载 2015-07-02 21:47:14 · 2136 阅读 · 0 评论 -
正确建立索引以及最左前缀原则
1. 索引建立的原则用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。仅仅出现在SELECT关键字后面的输出数据列列表中的数据列不是很好的备选列SELECTcol_a FROMtbl1 LEFT JOIN tbl2ON tbl1.col_b = tbl2.col_c WHEREcol_d =转载 2015-07-02 21:56:10 · 7730 阅读 · 0 评论 -
mysql多列索引和最左前缀
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度。索引优化是数据库优化的最重要手段。如果查询语句使用索引(通常是where条件匹配索引)就会利用树的结构加快查找,索引会按值查找到要查找的行在表中位置,不需回表查询数据的就是聚簇索引(索引和数据存放在一起)。通常是需要回表再查数据,需要消耗额转载 2015-07-02 21:55:37 · 3914 阅读 · 0 评论 -
mysql悲观锁总结和实践for update
最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科):悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制转载 2015-07-06 21:34:14 · 4561 阅读 · 2 评论 -
order by 不走索引的思考
MySql性能优化,order by 不走索引的思考2009-07-12 11:43今天早上查看网站,发现非常慢!进linux 用top查看,发现mysql cpu到了100%。开始怀疑是mysql性能的问题,不会10万条数据就卡成这样吧?虽然我的linux是在服务器上放了个虚拟机,但也不至于10万条记录挂啊? 网上找了一大把文章,my.cnf也设置了,我虚拟机内存转载 2015-08-29 09:29:30 · 10998 阅读 · 0 评论 -
mysql中kill掉所有锁表的进程
很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:mysql中kill掉所有锁表的进程2009-05-12 14:03转载请保留如下作者信息作者 : jesse博客 : http://hi.baidu.com/leechl3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂转载 2015-07-23 11:51:16 · 1589 阅读 · 0 评论 -
MySQL的InnoDB和MyISAM区别
功能MyISAMInnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI (MYIndex)。 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限转载 2015-07-23 11:50:49 · 1032 阅读 · 0 评论 -
MySQL函数总结
数学函数求绝对值函数abs()select fweight-50,abs(fweight-50),abs(-5.23) from t_person;求指数函数power()select fweight,power(fweight,-0.5),power(fweight,2),power(fweight,3),power(fweight,4) from t_person;求平转载 2015-07-23 11:48:05 · 1021 阅读 · 0 评论 -
对比Oracle和Mysql在锁机制上的类似和差异点
在进一步分析Hadoop相关的分布式事务和锁的机制前,有必要先整理和对比分析一下RDBMS领域最红的两大领军人物Oracle VS Mysql1:事务隔离级别oracle默认为Read committedMysql的InnoDB默认为Repeatable Read.2:锁类别oracle内部级封锁(对外不公布,无法了解)DDL锁(对数转载 2015-08-31 20:08:14 · 3690 阅读 · 0 评论 -
并发控制 mysql InnoDB表锁
InnoDB锁问题InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题。下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题。背景知识1.事务(Transaction)及其ACID属性事务是由一组SQ语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为转载 2015-08-31 12:02:58 · 916 阅读 · 0 评论 -
mysql单表更新及多表更新
历经Oracle,MS SQL Server,到现在的MySQL,跨越了3种资料库的学习与研究,现在对于MySQL的表更新,单表字段更新与其他类型的RDBMS资料库一样,多表级联更新还是有些区别的,不过研究过后,发现还是蛮简单的。 如果对你有所帮助,请回复一下,给个赞!UPDATE 语句用于中修改数据库表中的数据。更新数据库中的数据U转载 2015-08-31 11:35:12 · 1096 阅读 · 0 评论 -
jdbcType与javaType的对应关系
java.sql.Types 值Java 类型IBM DB2OracleSybaseSQLInformixIBM Content ManagerBIGINTjava.lang.longBIGINTNUMBER (38, 0)BIGINTBIGINTINT8DK_CM_BIGINTBINARYbyte[]转载 2015-10-08 14:31:05 · 2232 阅读 · 0 评论 -
MySQL binary 区分大小写
MySQL居然不区分大小写??我开始差点以为眼花了再做个查询..这是神马结果啊可以使用binary将字符串先转换为二进制字符串,在进行比较加上binary,终于正常了。SELECT * FROM ACT_cdKey WHERE ActivityId=3577 AND CdKey= binary '223UUwa转载 2016-05-05 11:24:17 · 6754 阅读 · 2 评论 -
mysql 5.6中的时间类型的新精度
在mysql 5.6中,time,timestamp,datetime都可以精确到微妙,并指定微秒的精确度了, 比如如下的例子: CREATE TABLE `t` ( `id` int(11) AUTO_INCREMENT, `t1` time(3), `t2` timestamp(6), `t3` datetime(1), `t4` datet转载 2016-07-01 11:52:15 · 8971 阅读 · 0 评论