
MySQL
文章平均质量分 91
老周聊架构
微信公众号:老周聊架构
展开
-
腾讯一面:你平时怎么排查并调优慢 SQL 的
一、前言上一篇我们说了 腾讯一面:说一说 MySQL 中索引的底层原理,相信你对索引有个很清晰的认识了,这一篇我们来说一说慢 SQL 的排查以及调优。为啥面试官要问这个问题,其实跟上一篇的索引底层原理有一定关联关系的,一般慢 SQL 很大一部分原因对索引底层原理不够特别了解导致的,比如没建索引、索引失效、索引没满足最左前缀匹配原则导致慢 SQL,像腾讯这样数据量很大的公司,人家肯定有专门的 DBA 去做优化的,面试官考察的主要是你排查问题的能力以及知道索引的底层原理、以及知道优化的方向,不至于让你进来把人原创 2022-04-11 23:10:29 · 2777 阅读 · 0 评论 -
一文读懂 MySQL Explain 执行计划
一、前言上周老周的一个好朋友让我出一篇教你读懂 SQL 执行计划,和我另一位读者反馈的面试题如何排查慢 SQL 的强相关,索性先出一篇一文读懂 MySQL Explain 执行计划。Explain 执行计划你一定得会看,不然你简历上就别去写什么你会 SQL 调优,不然面试官会觉得,Explain 执行计划你都不会看,那你还 SQL 调啥优啊?SQL 调你吧???开个小玩笑,玩笑归玩笑,重要是真的重要!!!二、Explain 执行计划是什么?什么是执行计划?简而言之,就是 SQL 在数据库中执行时的表现原创 2022-04-05 23:21:29 · 3925 阅读 · 2 评论 -
腾讯一面:说一说 MySQL 中索引的底层原理
一、前言最近有很多读者要我出一些面试题的文章,一般我会给他一个老周整理的电子书,但有些读者反馈回来的面试题我觉得还是蛮经典的,而老周又在写系列的文章,本着对读者负责的态度,我会穿插写几篇我认为比较经典的面试题,让大家对这种经典问题不再是背八股文,而是深入底层原理以及数据结构。后续再碰到这类问题,不管哪个公司问的,你都会得心应手、从容不迫的回答。今天这一篇腾讯的一道面试题:说一说 MySQL 中索引的底层原理,先不管哪个公司,如果老周是面试官,MySQL 这块我很可能也会用这道来考察,因为这可以考察出你对原创 2022-03-20 22:36:21 · 2834 阅读 · 2 评论 -
MySQL数据库设置时间字段为DateTime,展示给前台页面时,时间后面多了个.0
今天项目中碰到过这个问题,在考虑设计数据库表字段的时候,针对更新时间这个字段,我想到了datetime和timestamp两种类型,还有一种是date,我这里是要展示yyyy-MM-dd HH:mm:ss格式,而date类型是yyyy-MM-dd类型,所以date舍弃。关于datetime和timestamp两者的区别请戳下面链接:好了,了解完区别我们来看下针对时间后面多了个.0的问题怎么处理...原创 2019-09-09 22:45:53 · 3091 阅读 · 5 评论 -
MySQL数据库自增主键的间隔不为1的解决方法
今天新版本上线的时候,遇到了一个这样的问题,测试fvt环境的自增主键ID是每隔一位顺序增加,而上到lp类生产的环境,每插入一条数据,发现自增主键ID是每隔2增加。我首先想到的就是是不是类生产的环境的数据库的默认配置是每隔2的,带着这样的疑惑就来查看数据库不同环境的默认配置。fvt测试环境数据库配置:pr类生产环境数据库配置:哈哈哈,被我猜中了。下面就对auto_increment_i...原创 2019-09-09 19:25:10 · 4825 阅读 · 0 评论 -
MySQL中CONCAT()函数出现值为空的问题及解决办法
项目中用到了三个字段,需要对它们用concat() 函数进行拼接以及分组group by,下面一锅端了concat()的这个函数,有concat()、concat_ws()和 group_concat() 字段拼接的用法,我们来自己造点数据,做个测试。一、concat()1、准备一张test_concat表CREATE TABLE `test_concat` ( `id` int(11)...原创 2019-08-16 00:54:40 · 16782 阅读 · 0 评论 -
MySQL的主从延迟怎么解决
一、MySQL的数据库主从复制原理MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示:分为四步走:主库对所有DDL和DML产生的日志写进binlog;主库生成一个 log dump 线程,用来给从库I/O线程读取binlog;从库的I/O Thread去请求主库的binlog,并将得到的binlog日志写到relay log文件中;从库的SQL Threa...原创 2019-07-06 17:09:15 · 1845 阅读 · 0 评论 -
mysql在Windows下使用mysqldump命令手动备份数据库和自动备份数据库
手动备份:cmd控制台:先进入mysql所在的bin目录下,如:cd D:\program files (x86)\MySQL\MySQL Server 5.0\binmysqldump -u root -p 数据库 [表名1 表名2..] > 文件路径比如: 把test数据库备份到 d:\test.sqlmysqldump -u root -p test > d:\te...原创 2019-07-06 16:24:51 · 2146 阅读 · 0 评论 -
如何写sql能够有效的使用到复合索引
1、概念单一索引:单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;复合索引:复合索引也叫组合索引;用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;设计索引的一个重要原则就是能用窄索引不用宽索...原创 2019-07-06 11:50:07 · 2696 阅读 · 0 评论 -
MySQL中timestamp、datetime和int类型的区别与优劣
一、三者的区别1、int占用4个字节建立索引之后,查询速度快条件范围搜索可以使用使用between不能使用mysql提供的时间函数结论:适合需要进行大量时间范围查询的数据表2、datetime占用8个字节允许为空值,可以自定义值,系统不会自动修改其值实际格式储存(Just stores what you have stored and retrieves the same...原创 2019-09-10 01:02:20 · 2632 阅读 · 0 评论 -
MySQL中存储过程和函数的区别及优缺点
一、为什么要使用存储过程和函数存储过程和函数,是用来实现一组关于表操作的SQL语句、可重复地执行操作数据库的集合。存储过程和函数可以简单的理解为一条或多条SQL语句的集合。存储过程和函数就是事先经过编译并存储在数据库中的一段SQL语句集合。存储过程和函数执行不是由程序调用,也不是手动启动,而是由事件触发、激活从而实现执行的。他们的主要区别是函数必须有返回值,而存储过程可以没有。二、存储过程...原创 2019-09-14 17:41:20 · 8302 阅读 · 0 评论 -
MySQL使用存储过程30秒插入百万数据!!!
来了,老弟!!!没有骗你,30秒插入了百万数据!!!坐稳了,开车了。。。直接写个存储过程BEGIN DECLARE i INT DEFAULT 0; WHILE i < 1000000 DO INSERT INTO duplicated_user(name) VALUES ('edgar'); SET i = i + 1; END WHILE;END我这里直接在...原创 2019-09-15 00:43:35 · 2982 阅读 · 1 评论 -
MySQL中的innodb_flush_log_at_trx_commit参数
一、简介1、innodb_flush_log_at_timeout 这个参数的意思是刷新日志的时间,在mysql5.6版本中可以自定义,默认为1s。其与oracle有很大区别:在oracle中,有三种情况可以将日志缓冲区的数据写到在线日志文件中日志缓冲区中的记录达到1M每隔3秒日志缓冲区已经用了三分之一2、INNODB REDO日志:InnoDB为了保证日志的刷写的高效,使用了内存...原创 2019-09-15 00:59:03 · 4645 阅读 · 0 评论 -
MySQL百万数据删除表中重复数据只保留一条数据
看了网上方案,很多用到了关键字in,in适合类别少用的才效率高呀,而对于百万数据很多相同的话,直接导致索引失效,那就失去了这个关键字的意义了。我这里的方案是用存储过程:首先对有重复的name分组及查询出来,然后循环删除重复数据,相同的name只保留最大id的那一条。下面直接上存储过程:BEGIN DECLARE v_name INT(32); DECLARE v_maxid INT(10...原创 2019-09-15 13:06:54 · 1188 阅读 · 0 评论 -
MySQL中WHERE与HAVING的区别
一、使用的位置不一样where可以用于select、update、delete和insert into values(select * from table where …)语句中。having只能用于select语句中。二、执行的顺序不一样where的搜索条件是在执行语句进行分组之前应用。having的搜索条件是在分组条件后执行的。即如果where和having一起用时,where会...原创 2019-10-09 13:18:56 · 1159 阅读 · 0 评论 -
MySQL中UNION与UNION ALL的区别
一、UNION 操作符UNION 操作符合并两个或多个 SELECT 语句的结果组合成单个结果集。注意:UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。二、语法SQL UNION 语法SELECT column_name(s) FROM table1UNIONSELECT column_n...原创 2019-10-09 15:38:22 · 2197 阅读 · 0 评论 -
MySQL与Oracle的分页查询
一、MySQL 的分页查询关键字limit,limit m,n 其中m表示起始位置的下标,下标从0开始。n表示要显示的条数,比如要查询一个表的第0到1条数据。(表示第一页的第一条数据)格式:select * from table limit (pageNo-1)*pageSize, pageSize;SQL:mysql> SELECT * FROM suppliers LIMIT...原创 2019-10-09 16:54:38 · 464 阅读 · 0 评论 -
MVCC的含义,如何实现的?
一、MVCC简介1、什么是MVCCMVCC(Multi Version Concurrency Control的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能了解MVCC前,我们先学习下M...原创 2019-07-06 11:28:39 · 7249 阅读 · 2 评论 -
数据库自增主键可能的问题
单表的情况下数据库自增id并没有什么问题,在一张表分布到多个数据库的情况下,使用表自增将会出现id重复的问题。解决的办法有两个方向,一个是在应用层做处理,一个是数据库上去做处理。目前生成主键方法主要有以下几种:1、采用mysql自增长主键策略优点:简单,不需要程序特别处理缺点:这种方法对以后如果项目移植到其它数据库上改动会比较大,oracle、 db2采用Sequence,mysq...原创 2019-06-30 15:26:19 · 7227 阅读 · 0 评论 -
cmd命令创建连接MySQL数据库
一、连接MYSQL格式: mysql -h 主机地址 -u 用户名 -p 用户密码1、 连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码.如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到M...原创 2019-05-06 01:40:21 · 29241 阅读 · 4 评论 -
高并发下,如何做到安全的修改同一行数据
1、使用悲观锁悲观锁本质是当前只有一个线程执行操作,排斥外部请求的修改。遇到加锁的状态,就必须等待。结束了唤醒其他线程进行处理。虽然此方案的确解决了数据安全的问题,但是,我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接数被耗尽,系统陷入...原创 2019-05-08 23:20:42 · 13585 阅读 · 0 评论 -
聚集索引和非聚集索引的区别
一、深入浅出理解索引结构实际上,可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,因为“安”的拼音是...原创 2019-05-19 01:25:35 · 64755 阅读 · 23 评论 -
数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。
一、什么是事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。二、事务的四个特性事务具有四个特征:原子性( Atomicity )...原创 2019-05-07 00:17:48 · 12275 阅读 · 2 评论 -
MYSQL有哪些存储引擎,各自优缺点。
一、简介数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不多的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在My...原创 2019-05-07 22:15:26 · 10989 阅读 · 4 评论 -
乐观锁和悲观锁的区别
一、悲观锁(Pessimistic Lock)顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理...原创 2019-05-15 23:35:26 · 573 阅读 · 0 评论 -
InnoDB的标准行级锁有哪两种,解释其含义。
InnoDB 的行锁模式及加锁方法InnoDB实现了以下两种类型的行锁:共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。意向共...原创 2019-05-17 00:18:22 · 5807 阅读 · 4 评论 -
SQL优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。
一、执行计划是什么?执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL中使用 explain 关键字来查看二、查看执行计划EXPLAIN + sql语句mysql> explain select 1;+----+-------------+-------+------+---------------+------+-----...原创 2019-06-09 00:19:27 · 3985 阅读 · 2 评论 -
数据库会死锁吗,举一个死锁的例子,MySQL怎么解决死锁。
数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。在数据库...原创 2019-06-09 00:57:26 · 9786 阅读 · 6 评论 -
MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。
一、为什么需要索引?索引是数据表种一个或者多个列进行排序的数据结构索引能够大幅提升检索速度创建、更新索引本身也会耗费空间和时间二、查找结构进化史线性查找:一个个找;实现简单;太慢二分查找:有序;简单;要求是有序的,插入特别慢HASH查找:查询快;占用空间;不太适合存储大规模数据二叉查找树:插入和查询很快(log(n));无法存大规模数据,复杂度退化平衡树:解决 BST 退化...原创 2019-06-09 23:15:03 · 3260 阅读 · 0 评论 -
某个表有近千万数据,CRUD比较慢,如何优化?
优化之前我们先思考一下下面的问题:思考如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节;2.数据项:是否有大字段,那些字段的值是否经常被更新;3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、OR...原创 2019-06-26 00:28:06 · 3890 阅读 · 0 评论 -
select for update 是什么含义,会锁表还是锁行或是其他。
每次拿数据的时候都认为别的线程会修改数据,所以每次拿数据的时候都会给数据上锁。上锁之后,当别的线程想要拿数据时,就会阻塞。直到给数据上锁的线程将事务提交或者回滚。传统的关系数据库里面很多用了这种锁机制,比如行锁,表锁,共享锁,排他锁等,都是在做操作之前先上锁。(1)、 左边的线程,在事务中通过select for update语句给sid=1的数据行上了锁,右边的线程此时可以使用select语句...原创 2019-06-22 21:30:56 · 17288 阅读 · 1 评论 -
数据库的ACID是什么
事务在当今的企业系统无处不在,即使在高并发环境下也可以提供数据的完整性。一个事务是一个只包含所有读/写操作成功的集合。如下图:一、事务本质上有四个特点ACID:Atomicity 原子性Consistency 一致性Isolation 隔离性Durability 耐久性原子性原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。一致性一个事务可以...原创 2019-06-22 21:55:26 · 11640 阅读 · 0 评论 -
MySQL导入数据时提示 USING BTREE 报错解决办法
错误原因:主要是是MYSQL 5.0的一个BUG,其出现原因是mysql 5.1和mysql 5.0在处理到索引语句时有所区别。怎么查看自己mysql的版本?mysql> select version();+-----------+| version() |+-----------+| 5.0.18-nt |+-----------+1 row in set (0.00 s...原创 2019-06-27 00:04:41 · 3027 阅读 · 0 评论 -
MySQL中 in 和 exists 区别
一、提前准备为了大家学习方便,北哥在这里面建立两张表并为其添加一些数据。一张水果表,一张供应商表。水果表 fruits表f_idf_namef_pricea1apple5a2appricot2b1blackberry10b2berry8c1cocount9供应商表 suppliers表s_ids_name...原创 2019-06-29 02:43:40 · 15264 阅读 · 9 评论 -
MySQL数据库的索引原理、与慢SQL优化的5大原则
一、前言索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6 条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4 个页面,如果这10^6 个页面在磁盘上随机分布,需要进行10^4 次I/O,假设磁盘每次I/O时间为10ms(忽略数据传...原创 2019-05-06 01:14:45 · 1936 阅读 · 2 评论