202107-01 MySQL表字段时间设置默认值 应用场景在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间。在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意记录,而由数据库获取当前时间自动记录修改时间。在数据库中获取当前时间oracle:selectsysdatefromdual;sqlserver:selectgetdate();mysql:selectsysdate(); selectnow();MySQL中时间函数NOW()... 继续阅读 >
202106-29 MySQL中你可能忽略的COLLATION实例详解 前言MySQL数据库的字符串类型有CHAR、VARCHAR、BINARY、BLOB、TEXT、ENUM、SET。不同的类型在业务设计、数据库性能方面的表现完全不同,其中最常使用的是CHAR、VARCHAR。今天我就带你深入了解字符串类型CHAR、VARCHAR的应用。CHAR和VARCHAR的定义CHAR(N)用来保存固定长度的字符,N的范围是0~255,请牢记,N表示的是字符,而不是字节。VARCHAR(N)用来保存变长字符,N的范围为0~65536,N同样表示字符。在超出6... 继续阅读 >
202106-23 MySQL 如何分析查询性能 查询优化、索引优化和表设计优化是环环相扣的。如果你有丰富的编写MySQL查询语句的经验,你就会知道如何设计表和索引来支持有效的查询。同样的,知晓表设计同样有助于了解表结构如何对查询语句产生影响。因此,即便表设计和索引都设计得很好,但如果查询语句写得很糟糕,那查询的性能也会很糟糕。在尝试编写快速的查询语句前,务必记住快速都是基于响应时间进行评估的。查询语句是一组由多个子任务组成的大任务,每一个子任务都会... 继续阅读 >
202106-23 如何用Navicat操作MySQL 前言:日常使用MySQL的过程中,我们可能会经常使用可视化工具来连接MySQL,其中比较常用的就是Navicat了。平时也会遇到某些同学问,Navicat怎么安装,如何使用等问题。本篇文章笔者将结合个人经验,分享下Navicat操作MySQL简易教程。1.Navicat简介Navicat是一款成熟可靠的数据库管理工具,深受技术人员的喜爱。它是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。Navicat... 继续阅读 >
202106-23 MySQL EXPLAIN输出列的详细解释 1.简介EXPLAIN语句提供有关MySQL如何执行语句的信息。EXPLAIN与SELECT、DELETE、INSERT、REPLACE和UPDATE语句一起使用。mysql>EXPLAINSELECT*FROMemployeesWHEREemp_no=10001;+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows... 继续阅读 >
202106-23 MySQL 分页查询的优化技巧 在有分页查询的应用中,包括LIMIT和OFFSET的查询十分常见,而且几乎每个都会有一个ORDERBY子句。如果使用索引排序的话将对性能优化十分有帮助,否则服务端需要做很多文件排序。一个高频的问题是offset的值过大。如果查询类似LIMIT10000,20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。假设所有的页使用相同的频次访问,这样的查询将平均扫描一半数据表。为了优化他们,你可以在分页视图中限制最多可访... 继续阅读 >
202106-23 MySQL 分组查询的优化方法 MySQL在处理GROUPBY和DISTINCT查询的方式在大多数情况下类似,事实上,在优化过程中有时候会把在这两种方式中转换。两类查询都能够从索引中受益,通常,这也是优化这两种查询最为重要的方式。在无法使用索引时,MySQL对于GROUPBY查询有两种策略:使用临时表或者filesort执行分组。对于给定的查询,两种方式都没法更高效。我们可以通过配置SQL_BIG_RESULT和SQL_SMALL_RESULT来指定优化器选择其中一个方式。通常,对... 继续阅读 >
202106-23 MySQL索引知识的一些小妙招总结 一、索引基本知识1.1索引的优点大大减少了服务器需要扫描的数据量,加快数据库的检索速度帮助服务器避免排序和临时表将随机io变成顺序io1.2索引的用处速查找匹配WHERE子句的行从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行当有表连接的时候,从其他表检索行数据查找特定索引列的mi... 继续阅读 >
202106-23 MySQL COUNT函数的使用与优化 COUNT函数做什么用?COUNT是一个专用的函数,通常有两种不同的方式:计算值和数据行。值指的是非空(Non-NULL)表达式(NULL表示值缺失)。如果我们在COUNT的参数中指定了列名或其他表达式,则COUNT函数是计算该表达式拥有值的次数。这让很多人困惑,相当一部分的原因是值和NULL的概念是模糊的。另一种COUNT的形式是简单地计算结果集的数据行数。这是在MySQL知道COUNT函数参数的表达式不可能为NULL时的计算方式。最... 继续阅读 >
202106-23 解读MySQL的客户端和服务端协议 如果需要从MySQL服务端获得很高的性能,最佳的方式就是花时间研究MySQL优化和执行查询的机制。一旦理解了这些,大部分的查询优化是有据可循的,从而使得整个查询优化的过程更有逻辑性。下图展示了MySQL执行查询的过程:客户端将SQL语句发送到服务端。服务端检查查询缓存。如果缓存中已有数据,则直接返回缓存结果;否则,将SQL语句传递给下一环节。服务端解析、预处理和优化SQL语句后,传递到查询优化器中... 继续阅读 >
202106-23 MySQL 重写查询语句的三种策略 在优化存在问题的查询时,我们需要改变方式去获取查询结果——但这并不意味着从MySQL获取同样的结果集。有些时候我们可以将查询转换为获取相同结果,但更好性能的查询形式。然而,我们也需要考虑重写查询去获取不同的结果,因为这样可以提高开发效率。也可以通过修改应用程序代码来取得相同的效果。本篇文章将介绍如何重写查询的技巧。复杂查询与分步查询一个重要的查询设计课题是将复杂查询分解为多个简单查询是否会更好。在传统... 继续阅读 >
202106-23 详解MySQL 联合查询优化机制 MySQL联合查询执行策略。以一个UNION查询为例,MySQL执行UNION查询时,会把他们当做一系列的单个查询语句,然后把对应的结果放入到临时表中,最终再读出来返回。在MySQL中,每个独立的查询都是一个联合查询,从临时表读取返回结果也一样。这种情形下,MySQL的联合查询执行很简单——它将这里的联合查询当做是嵌套循环的联合查询。这意味着MySQL会运行一个循环去从数据表读取数据行,然而在运行一个嵌套循环从下一个表读... 继续阅读 >
202106-19 MySQL Threads_running飙升与慢查询的相关问题解决 背景年前本应该是回顾一年工作和收尾的阶段,奈何各种促销,活动都等着春节,因此也遇到了不少的问题,回顾了一下最近遇到的问题,发现有好几个问题比较类似,正好整理一下,作为年前收尾的案例吧。表现上都是数据库假死,无响应,发生的场景有较高的业务压力到来时,也有业务正常运行的时候,突然就出现问题了。问题描述由于腾讯云数据库MySQL本身是有故障检测和高可用机制的,这几例问题发生的时候,从用户反馈的问题出现的时... 继续阅读 >
202106-19 MySQL sql_mode的使用详解 前言相信看过上一篇文章《MySQL案例:一个数据丢失惨案》的童鞋,都应该意识到,sql_mode是一个非常关键的配置,接下来就带来该配置项的详细解析。sql_mode详解sql_mode,会直接影响SQL语法支持和数据校验,它包含非常多的选项,其中5.7版本的默认值是“ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,;ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”,一般不建议进行修改。最... 继续阅读 >
202106-19 MySQL 数据丢失排查案例 前言最近,有一位朋友突然微信联系我,说MySQL出现了数据丢失的情况;毫无疑问,对于一个DBA而言,这无疑是最令人紧张的一件事情,没有之一;听到这个消息后,我也就立刻投入到问题排查中。现场排查一开始听到这个消息,我心里面当然也是非常紧张,不过很快就让自己冷静下来,开始进行排查:(1)实例状态是不是正常的? --经确认,实例状态正常(2)业务库是哪个?是否还存在?是否被删除? ... 继续阅读 >
202106-19 MySQL update set 和 and的区别 问题描述最近接到一个奇怪的咨询,update语句执行没有报错,但是没有更新数据,具体有问题的语句类似于如下形式:updatetest.stusetcname='0'andmath=90andhis=80whereid=100;原因分析直观上看,这个update语句的语法是有问题的,正常更新多列数据的语法应该是用逗号,类似于如下形式:updatetest.stusetcname='0',math=90,his=80whereid=100;直接用and第一反应其实是会报语法错误,不太像是能... 继续阅读 >