![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库—Mysql
一颗向上的草莓
后台开发者,前端爱好者,个人博客:http://catchu.github.io
展开
-
MySQL1000万条数据分页查询优化
这种问题的解决就是通过构建一个新的小表,以小表来join驱动大表;或者构建一个子查询语句,用exist,in做查询;或者注意索引下推和索引覆盖的使用。概述今天一个朋友问我一个问题,说MySQL很多数据查询怎么优化。我就直接说了个分页查询就行了啊,查询字段加索引。然而结果并没有我想象得那么简单,他分页查询直接把服务查崩了。原来他们数据量已经有好几百万了。你可能会问不就几百万数据吗,分页只查询10条怎么可能查询会很慢。后面我会模拟1000万条数据分页查询。准备工作1.新建一个测试库,我这里就叫转载 2020-06-30 10:35:29 · 2239 阅读 · 0 评论 -
datetime和timestamp的区别
timestamp存储的时间与时区有关,变换时区数据会受影响;datetime与时间无关;timestamp存储时间范围小,1970-01-01 00:00:00到2038-01-19 03:14:07;datetime没有这个限制。所以工作中要尽量用datetime。时间日期数据类型总概况MySQL中有多种表示时间日期的数据类型,主要有YEAR、TIME、DATE、DATETIME、TIMESTAMP等。每一种数据类型都有存储的时间日期格式、以及取值范围,因此在使用时间日期数据类型的时候需转载 2020-06-30 08:53:28 · 19670 阅读 · 1 评论 -
InnoDB MVCC 机制
本文详细的介绍了什么是MVCC?为什么要有MVCC?以及MVCC的内部实现原理:包括Undo Log的版本链是如何组织的,RR、RC两个级别下一致性读是如何实现的等。通过案例、插图,以最通俗易懂的方式,让你彻底掌握MVCC的来龙去脉。1 什么是MVCCMVCC (Multiversion Concurrency Control)中文全称叫多版本并发控制,是现代数据库(包括MySQL、Oracle、PostgreSQL等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的...转载 2020-06-29 13:35:18 · 353 阅读 · 1 评论 -
为什么推荐InnoDB引擎使用自增主键
结论:B树叶子结点和非叶子节点均存储了子节点的指针和数据域,导致非叶子节点容纳的指针减少,故树高比较高;B+树,叶子节点存储数据域,非叶子节点存储子节点指针,所以每页可以容纳更多指针,树高更低,磁盘IO更少。MyISAM的叶子节点存储的是数据所在的地址,还需要根据这个地址查询真正的数据,非聚簇索引结构,数据和索引是分开的;INNODB的叶子节点存储的是主键key和行记录数据,聚簇索引,数据和索引是在一起的。Innodb使用自增或者有升高趋势的(比如雪花算法生成的id)目的是自增的主键是在插入转载 2020-06-26 23:04:35 · 641 阅读 · 0 评论 -
【mysql】关于InnoDB存储引擎 text blob 大字段的存储和优化
最近在数据库优化的时候,看到一些表在设计上使用了text或者blob的字段,单表的存储空间已经达到了近100G,这种情况再去改变和优化就非常难了一、简介为了清楚大字段对性能的影响,我们必须要知道innodb存储引擎的处理方式:1、一些知识点1.1 在InnoDB 1.0.x版本之前,InnoDB 存储引擎提供了Compact和Redundant(Redundant 格式是为兼容之前版本而保留的)两种格式来存放行记录数据,compact 和 redundant 合称为Antelope...转载 2020-06-24 17:33:04 · 494 阅读 · 0 评论 -
mysql的text与off-page
经常遇到这样的问题:表中的大字段列(text)怎么处理?是应该独立成一张表,还是尽量变成varchar,对性能到底有什么影响。先来看一些知识点1.innodb_page_size在innodb引擎下(5.6),有一个参数innodb_page_size,默认值是16k。(PS: 这个参数在数据库初始化的时候就要放在my.cnf中,如果已经创建了表再修改此参数,mysql就会启动不起来)show VARIABLES like '%innodb_page_size%'--------.转载 2020-06-24 16:11:32 · 669 阅读 · 0 评论 -
解读mysql的可重复读、幻读及实现原理
事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为什么会出现幻读?是否解决了幻读的问题?一、事务的隔离级别Read Uncommitted(未提交读)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。该级别用的很少。Read Committed(提交读)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变,换句话说就是事原创 2020-06-22 09:53:43 · 494 阅读 · 0 评论 -
超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
目前数据库的类型主要分为两种,一种是关系型数据库,另一种是非关系型数据库(NoSQL)。而我们今天的主角MySQL就是关系型数据库中的一种。本文结构1关系型数据库与NoSQL关系型数据库,顾名思义,是指存储的数据之间具有关系。这种所谓的关系通常用二维表格中的行列来表示,即一个二维表的逻辑结构能够反映表中数据的存储关系。概念总是拗口难懂的。那么简单来说,关系型数据库的存储就是按照表格进行的。数据的存储实际上就是对一个或者多个表格的存储。通过对这些表格进行分类、合并、连接或者选...转载 2020-06-08 21:22:08 · 353 阅读 · 0 评论 -
Explain执行计划中各个字段的含义
Explain有什么用当Explain与SQL语句一起使用时,MySQL会显示来自优化器关于SQL执行的信息。也就是说,MySQL解释了它将如何处理该语句,包括如何连接表以及什么顺序连接表等。 表的加载顺序 sql的查询类型 可能用到哪些索引,哪些索引又被实际使用 表与表之间的引用关系 一个表中有多少行被优化器查询 ..... Explain有哪些信息Explain执行计划包含字段信息如下:分别是id、select_type、table、...原创 2020-06-08 17:03:49 · 2775 阅读 · 0 评论 -
MySQL中update修改数据与原数据相同会再次执行吗
结论:如果binlog_format是row格式则不会执行,如果是statement格式则会再次执行 ,是mixed格式的不知道(待查)。原因:row格式会记录哪条语句被修改了,被修改成了什么样子,所以它是能知道这条语句的原始值的。而statement只记录这条语句本身,所以它不知道原来值是什么,也就只能执行。具体参考:https://blog.csdn.net/u011277123/article/details/88739350binlog日志格式参考:https://www.cnblogs.c原创 2020-06-07 18:16:36 · 183 阅读 · 0 评论 -
Mysql的事务隔离级别和多版本并发控制
P0 事故:余额多扣!这是一个真实的生产事件,事件起因如下:现有一个交易系统,每次产生交易都会更新相应账户的余额,出账扣减余额,入账增加余额。为了保证资金安全,余额发生扣减时,需要比较现有余额与扣减金额大小,若扣减金额大于现有余额,扣减余额不足,扣减失败。账户表(省去其他字段)结构如下:CREATETABLE`account`(`id`bigint(20)NOTNULL,`balance`bigint(20)DEFAULTNULL,...转载 2020-06-03 09:27:54 · 313 阅读 · 1 评论 -
MySQL如何有效的存储IP地址
针对这个问题,首先声明一下,将 IP地址 以字符串的形式保存在数据库是完全没问题的。那么你可能就有疑问了?既然没问题,那你还在这里瞎比比什么呢?虽然,这是一个前后矛盾的话题,但是除了存字符串以外,我们还有其他的存储方式。例如比较常用的,将 IP地址 存成 int 型的数据,这种存储方式虽然实现起来不复杂,但是能想到该方法,也从一定程度上表明了你是一个善于思考,对数据底层基础把握的比较到位。因为一个 int 型的数据占 4 个字节,每个字节 8 位,其范围就是 0~(2^8-1),而 ipv4地址 可转载 2020-06-01 22:00:52 · 294 阅读 · 0 评论 -
关于mysql最左前缀原则
背景知识:mysql中可以使用explain关键字来查看sql语句的执行计划。最左前缀原则主要使用在联合索引中数据库版本Mysql5.5.531.首先准备如下测试数据表CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `cid` int(11) DEFAULT NULL, `school` char(20) NOT NULL DEFAULT '', KEY `...转载 2020-06-01 14:10:25 · 182 阅读 · 0 评论 -
MySQL的SELECT ...for update
最近的项目中,因为涉及到Mysql数据中乐观锁和悲观锁的使用,所以结合项目和网上的知识点对乐观锁和悲观锁的知识进行总结。悲观锁介绍 悲观锁是对数据被的修改持悲观态度(认为数据在被修改的时候一定会存在并发问题),因此在整个数据处理过程中将数据锁定。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在应用层中实现了加锁机制,也无法保证...转载 2020-03-02 21:00:57 · 136 阅读 · 0 评论 -
mysql prepare语句使用
语法PREPARE statement_name FROM sql_text /*定义*/EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/DEALLOCATE PREPARE statement_name /*删除定义*/例mysql> PREPARE prod FROM "IN...转载 2019-05-28 10:25:57 · 6153 阅读 · 0 评论 -
Mysql数据库主从复制和分库分表浅析
内容提供:李智慧,前阿里巴巴技术专家,《大型网站技术架构》作者分布式数据库和分布式存储是分布式系统中难度最大、挑战最大,也是最容易出问题的地方。互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。接下来,你将花费十分钟掌握以下三方面内容:1、MySQL复制:包括主从复制和主主复制;2、数据分片:数据分片的原理、分片的方案、分片数据库的扩容;3、数据库分布...转载 2019-07-16 11:29:25 · 806 阅读 · 0 评论 -
MySQL Binlog 介绍
Binlog 简介MySQL中一般有以下几种日志:日志类型 写入日志的信息 错误日志 记录在启动,运行或停止mysqld时遇到的问题 通用查询日志 记录建立的客户端连接和执行的语句 二进制日志 记录更改数据的语句 中继日志 从复制主服务器接收的数据更改 慢查询日志 记录所有执行时间超过long_query_time秒的所有查询或不...转载 2019-07-23 16:59:42 · 127 阅读 · 0 评论 -
MySQL Binlog 解析工具 Maxwell 详解
maxwell 简介Maxwell是一个能实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。它的常见应用场景有ETL、维护缓存、收集表级别的dml指标、增量到搜索引擎、数据分区迁移、切库binlog回滚方案等。官网(http://...转载 2019-07-23 17:01:12 · 659 阅读 · 0 评论 -
mysql索引常见问题
相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在索引方面的知识,只...转载 2019-07-24 13:01:58 · 161 阅读 · 0 评论 -
MySQL索引和查询优化
索引相关索引基数基数是数据列所包含的不同值的数量,例如,某个数据列包含值 1、3、7、4、7、3,那么它的基数就是 4。索引的基数相对于数据表行数较高(也就是说,列中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行;如果某个数据列用于记录性别(只有“M”和“F”两种值),那么索引的用处就不大;如...转载 2019-07-26 10:47:14 · 219 阅读 · 0 评论 -
mysql索引篇之覆盖索引、前缀索引、索引下推
覆盖索引在之前《mysql索引初识》这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引树中,叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。假如我们现在有如下表结构CREATE TABLE `user_table` ( `id` i...原创 2019-09-10 16:22:27 · 696 阅读 · 0 评论 -
Mysql多版本并发控制(MVCC)是指什么
我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能。什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,而每一个事务在启动的时候,都有一个唯一的递增的版本号。1、在插入操作时 : 记录的创建版本号就是事务版本号。比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事...原创 2019-09-10 19:29:41 · 277 阅读 · 1 评论 -
Mysql中使用explain进行性能分析
explain显示了MySQL如何使用索引来处理select语句以及连接表。原创 2017-07-26 18:04:01 · 302 阅读 · 0 评论