创建索引CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,...)其中对应的语法变量信息如下:[UNIQUE|FULLTEXT|SPATIAL]中括号中的这三个关键字表示创建的索引类型,它们分别表示唯一索引、全文索引、空间索引三种不同的索引类型。如果我们不指定任何关键字,则默认为普通索引。index_nameindex_name表示索引的名
很简单,就是为了统计记录数由SELECT返回为了理解这个函数,让我们祭出 employee_tbl 表注意:由于 SQL 查询对大小写不敏感,所以在 WHERE 条件中,无论是写成 ZARA 还是 Zara,结果都是一样的count(1),count(*),count(字段)区别count(1)和count(*)作用都是检索表中所有记录行的数目,不论其是否包含null值区别count(1)比count(*)效率高二 . count(字段)与count(1)和count(*)的区别
在MySQL中,整数和浮点数的定义都是有多种类型,整数根据实际范围定义,浮点数语言指定整体长度和小数长度。浮点数类型包括单精度浮点数(float型)和双精度浮点数(double型)。定点数类型就是decimal型。定点数以字符串形式存储,因此,其精度比浮点数要高,而且浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数decimal比较安全。MySQL 是支持 bigint 和 bigdecimal 数据类型存储的,当然还有 numberic,numberic 的作用与
1 Schema概念schema在数据库中表示的是数据库对象集合,它包含了各种对像,比如:表,视图,存储过程,索引等等。一般一个用户对应一个集合,所以为区分不同集合就需给不同集合起名。用户的schema名就相当于用户名,并作为该用户缺省schema。所以schema集合看上去像用户名。例如当我们访问一个数据表时,若该表没有指明属于哪个schema,系统就会自动加上缺省的schema。2 Schema的创建在不同的数据库中要创建的Schema方法是不一样的,但是它们有一个共同的特点就是都支持CR
21 | 为什么我只改一行的语句,锁这么多?2018-12-31 林晓斌在上一篇文章中,我和你介绍了间隙锁和next-key lock的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。所以今天,我们就先从这个加锁规则开始吧。首先说明一下,这些加锁规则我没在别的地方看到过有类似的总结,以前我自己判断的时候都是想着代码里面的实现来脑补的。这次为了总结成不看代码的同学也能理解的规则,是我又重新刷了代码临时总结出来的。所以,这个
某日,尼古拉斯赵四 crud 完后,突发奇想:MySQL大in查询技术还能优化吗?还是只能业务优化?。注意,in里面的数据随用户选择类型成递增。x团:可以试试 in 分批查!赵四:不行啊,这是个分页,无法分批吧!x节:不妨提升下问题维度,解决大 in 才是!赵四:哈雷?业务上解决吗?x里@x节:分表并发是嘛?xx@x节:加字段就行嘛。x60 突然插话:in 多了就会全表扫描了。赵四应到:是啊,历史坑点,现在突然爆发了。x东:union 或者or in试试,对比下性能即可。其实不同业务不
案例准备主键id,索引c。下面的语句怎么加锁,何时释放?该语句会命中d=5一行,对应主键id=5。因此在select 语句执行完后,id=5一行会加写锁。因两阶段锁协议,写锁会在执行commit语句时释放。由于字段d无索引,该查询语句会全表扫描。其他被扫到但不满足条件的5行记录会不会被加锁呢?InnoDB默认事务隔离级别可重复读。幻读若只在id=5一行加锁,而其他行不加锁:假设只在id=5一行加行锁session A执行三次查询-Q1、Q2和Q3,SQL语句相同:查所有d
除了B-Tree 索引,MySQL还提供了如下索引:Hash索引只有Memory引擎支持,场景简单R-Tree索引MyISAM的一个特殊索引类型,主要用于地理空间数据类型Full-textMyISAM的一个特殊索引,主要用于全文索引,从MySQL 5.6开始InnoDB支持全文索引索引 / 存储引擎MyISAMInnoDBMemoryB-Tree索引支持支持支持HASH索引不支持不支持支持R-Tree索引支持支持不支持Full-t
数据库也需要合理控制资源的访问规则,而锁就是用来实现这些访问规则的数据结构。根据加锁的范围,MySQL里面的锁大致可以分成全局锁表级锁行锁今天先说全局锁和表级锁。全局锁对整个数据库实例加锁。MySQL提供了一个加全局读锁的命令 Flush tables with read lock (FTWRL)当需要让整个库只读时,可使用该命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)数据定义语句(包括建表、修改表结构等)更新类事务的提交语句典型使用场景做全库逻辑
为什么需要字典表?某些变量在多个地方使用,而且一般固定,但随系统升级和后期变化,可能需要改变,如果这些变量写死在代码里面将会变得难以维护,所以要将其从代码中抽离。一般的业务系统客户端与用户交互的时候都会使用下拉框组件,对于某些比较固定的值的下拉组件的数据来源一般都是比较固定的文本。实现方案有的人使用枚举或Constants实现,这种情况下在量少的前提是没问题,而且一旦需要修改就避免修改源码;随系统不断演进,后期将无法维护,甚至命名困难。所以通常把字典放在数据库,维护变更就简单了,达到在不修改代码情
redo log是基于磁盘的数据结构,在崩溃恢复期间用于修正未完成的事务写入的数据。正常操作期间,redo log编码更改表数据的请求,这些请求是由SQL语句或低级API调用引起的。在初始化期间以及接受连接之前,会自动重播在意外关闭之前未完成更新数据文件的修改。默认,redo log在磁盘上由ib_logfile0和ib_logfile1两个文件物理表示。 MySQL以循环方式写入redo log文件。redo log中的数据按照受影响的记录进行编码;此数据统称为重做。通过redo log的数据传递以不
分页方式1:select * from table order by id limit m, n;该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。方式2:select * from table where id > #max_id# order by id limit n;该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量
SQL 语句主要可以划分为以下 3 个类别。DDL(Data Definition Languages)语句数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。DML(Data Manipulation Language)语句数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。(增添改查)
SQL 语句主要可划分为如下:DDL(Data Definition Languages)语句数据定义语言,这些语句...
面试官:以市民表为例,假设 查询城市是“上海”的所有人名字,并按照姓名排序返回前1000个人的姓名、年龄。于是直接一把表定义:SQL这么一写:语句看着简单而朴实。面试官:说说它到底怎么执行的?还好我之前就研究过。全字段排序为了避免全表扫描,所以在给 city 字段加索引。在city字段上创建索引之后,我们用explain命令来看看这个语句的执行情况。explain命令查看语句的执行情况 explain select city, name, age citizen
4 change buffer4.1 基本概念change buffer是一种特殊的数据结构,当这些页面不在缓冲池中时,这些高速缓存会将更改缓存到辅助索引页面。可能由INSERT,UPDATE或DELETE操作(DML)导致的缓冲更改将在以后通过其他的读取操作将页加载到缓冲池中时合并。如上图可见,change buffer用的是buffer pool里的内存,所以不能无限增长。change buffer大小可通过参数innodb_change_buffer_max_size动态设置。比如设置为5
需要考虑一次批量的条数多少呢?即 sql 里?的数量限制。
修改字段类型、名、注释、类型长度、默认值ALTER TABLE 表名 MODIFY [COLUMN] 字段名 新类型 新类型长度 新默认值 新注释;-- COLUMN关键字可以省略不写 -- 能修改字段类型、类型长度、默认值、注释 alter table table1 modify column column1 decimal(10,1) DEFAULT NULL COMMENT '注释'; -- 能修改字段类型、类型长度、默认值、注释 alter table table
1 SQL优化show status了解各种SQL的执行效率:# 查看本session的sql执行效率show status like 'Com_%';# 查看全局的统计结果SHOW GLOBAL STATUS LIKE 'Com_%'# 查看服务器的状态show global status;结果:Com_select:执行select操作的次数,一次查询只累加1Com_insert:执行insert操作的次数,对于批量插入的insert操作,只累加一次Com_updat
一般情况下,我们需要的聚合数据(总和,平均数,最大最小值等)并不总是存储在表中。 但可以通过执行存储数据的计算来获取它。例如,由于orderDetails表仅存储每个项目的数量和价格,无法通过从orderdetails表直接查询获得每个订单的总金额。必须为每个订单查询项目的数量和价格,并计算订单的总额。要在查询中执行此类计算,就要使用聚合函数了。聚合函数对一组值执行计算并返回单个值。MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等。除COUNT函数外,其它聚合函数在执
当MySQL去更新一行,但是要修改的值跟原来的值是相同的,这时候MySQL会真的去执行一次修改吗?还是看到值相同就直接返回呢?选项一:MySQL读出数据,发现值与原来相同,不更新,直接返回,执行结束。做一个锁实验来确认。假设,当前表t里的值是(1,2)。锁验证方式session B的update 语句被阻塞,加锁这个动作是InnoDB才能做的,所以排除选项1。第二个选项,MySQL调用InnoDB引擎提供的接口,但是引擎发现值与原来相同,不更新,直接返回。有没有这种可能呢?一个可见性
分区表有什么问题,为什么公司规范不让使用分区表呢?什么是分区表在示例表插入两条记录,按分区规则,记录分别落在p_2018和p_2019分区。可见,该表包含了一个.frm文件和4个.ibd文件,每个分区对应一个.ibd文件:对于引擎层,这是4个表对于Server层,这是1个表分区表的引擎层行为举个在分区表加间隙锁的例子,目的是说明对于InnoDB来说,这是4个表。分区表间隙锁session_1session_2T1begin; select * from t
为什么备库执行了binlog就可以跟主库保持一致?MySQL主备的基本原理基本的主备切换流程上部分状态:客户端的读写都直接访问A,B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持B和A的数据相同。当需要切换时,就切成下部分状态:客户端读写访问的都是B,A是
在业务高峰期临时提升性能的方法。WAL机制(你可以再回顾下第2篇、第9篇、第12篇和第15篇文章中的相关内容),得到的结论是:只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。redo log的写入流程是怎么样的,如何保证redo log真实地写入了磁盘?binlog的写入机制事务执行过程中,先把日志写到binlog cache,事务提交时,再把binlog cache写到binlog文件。一个事务的binlog是不能被拆开的,因此不论这个事务多大,
我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光?逻辑备份时,可不就是做整库扫描吗?若这样就会把内存吃光,逻辑备份不是早就挂了?所以大表全表扫描,看起来应该没问题。这是为啥呢?全表扫描对server层的影响假设,我们现在要对一个200G的InnoDB表db1. t,执行一个全表扫描。当然,你要把扫描结果保存在客户端,会使用类似这样的命令:mysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t"
在一个主备关系中,每个备库接收主库的binlog并执行。正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确执行,备库就能达到跟主库一致的状态,这就是最终一致性。但MySQL要提供高可用能力,只有最终一致性还不够。为什么呢?MySQL主备切换流程–双M结构主备延迟主备切换可能是:主动运维动作比如软件升级、主库所在机器按计划下线等被动操作比如主库所在机器掉电。同步延迟与数据同步有关的时间点主要包括以下三个:主库A执行完成一个事务,写入binlog,该时
对于下面这个三个表的join语句select * from t1 join t2 on(t1.a=t2.a) join t3 on (t2.b=t3.b) where t1.c>=X and t2.c>=Y and t3.c>=Z;若改写成straight_join,要怎么指定连接顺序,以及怎么给三个表创建索引?尽量使用BKA算法使用BKA,并非“先计算两个表join的结果,再跟第三个表join”,而是直接嵌套查询的。具体实现:在t1.c>=X、t2.c>=
DBA禁用join若有两个大小不同的表做join,用哪个表做驱动表?今天这篇文章,我就先跟你说说join语句到底是怎么执行的,然后再来回答这两个问题。示例表:往表t2里插入了1000行数据在表t1里插入的是100行数据可见,两表都有一个主键索引id和一个索引aIndex Nested-Loop Joinselect *from t1 straight_join t2 on (t1.a = t2.a);若直接使用join语句,MySQL优化器可能会选择表t1或t2作为驱动表,.
一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?初始化只有两行的表:事务A、B、C的执行流程事务是何时启动的?begin/start transaction并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB表的语句,事务才真正启动。一致性视图是在执行第一个快照读语句时创建的start transaction with co
环境macOS Catalinaclion2020.1首先从 GitHub 获取 mysql 源码,直接通过 git pull 拉取代码。切换到 5.7 分支。操作生成目录// 生成编译后安装目录及数据目录mkdir -p build_out/data编译cmake . -DWITH_DEBUG=1 \-DCMAKE_INSTALL_PREFIX=build_out \-DMYSQL_DATADIR=build_out/datamake && make in
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号