mysql数据库

MySQL的索引结构

喜你入骨 提交于 2020-01-10 05:54:51
目录 索引是什么? 索引的作用 为什么索引的数据结构使用B+Tree? 平衡二叉查找树 多路平衡查找树 B-Tree 多路平衡查找树加强版 B+Tree B+Tree与B-Tree的区别 MySQL中B+Tree的表现形式 MyISAM引擎 InnoDB引擎 覆盖索引 联合索引 最左前缀原则 索引是什么? 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 索引的作用 索引能极大的减少存储引擎需要扫描的数据量。 索引可以把随机IO变成顺序IO。 索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。 为什么索引的数据结构使用B+Tree? 平衡二叉查找树 缺点: 太高:树的高(深)度决定着它的IO操作次数。显然,当数据量逐渐增加时,平衡二叉树的深度也会显著增加。 太小:每一个节点保存的数据量太小了。没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作。 多路平衡查找树 B-Tree 查询的效率取决于与磁盘IO的次数,减少磁盘IO的次数就必须要压缩树的高度,B-Tree 很好的解决了平衡二叉树的小与高的问题,让瘦高的树尽量变成矮胖的树。 多路平衡查找树加强版 B+Tree B+Tree与B-Tree的区别 B+Tree节点关键字搜索采用闭合区间。 B

MySQL MVCC Undo log Redo log

折月煮酒 提交于 2020-01-10 05:35:55
目录 什么是MVCC? MVCC-插入 MVCC-删除 MVCC-修改 MVCC-查询 Undo log Redo log 什么是MVCC? Multi Version Concurrency Control (多版本并发控制) 并发访问(读或写)数据库时,对事务内正在处理的数据做多版本管理。以实现写操作堵塞的同时,依然可以进行读操作。 MVCC-插入 插入规则:在数据行版本号列保存当前事务ID。 MVCC-删除 删除规则:将删除版本号列更新为当前事务ID。 MVCC-修改 修改规则:现将命中的数据行copy,将原数据的删除版本号设置为当前事务ID(33)。 MVCC-查询 查询规则: 1. 查找数据行版本小于或等于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始之前就存在的,要么是事务自身插入或修改过的; 2. 查找删除版本号要么为NULL,要么大于当前事务版本号的数据行。这样可以确保查询出来的记录在事务开启前没有被删除。 Undo log Undo意为取消,以撤销操作为目的,返回指定某个状态的操作。 Undo log指事务开始之前,在操作任何数据之前,首先将需操作的数据备份到一个地方 (Undo Log)。 UndoLog是为了实现事务的原子性而出现的产物。 Undo Log实现了事务的原子性: 事务处理过程中如果出现了错误或者用户执行了 ROLLBACK语句

MySQL AutoCommit带来的问题

≯℡__Kan透↙ 提交于 2020-01-10 05:02:11
原创内容,转载请注明出处 http://www.cnblogs.com/wingsless/p/6803542.html 现象描述 测试中发现,服务A在得到了服务B的注册用户成功response以后,开始调用查询用户信息接口,却发现无法查询出任何结果。检查binlog发现,在查询请求之前,数据库确实已经完成了commit操作,并且可以在sqlyog等客户端工具中查询出正确的结果。 下面是这个流程的时序图: 问题出现在Server A向数据库发起查询的时候,返回的结果总是空。 问题分析 这个问题显然是一个事务隔离的问题,最开始的思路是,服务A所在的机器,其事务开启时间应该是在服务B的机器commit操作之前开启的,但是通过DEBUG日志分析connection的获取和提交时间,发现两个服务器之间不存在这样的关系,服务B永远是在服务A返回了正确的response之后才会调用数据库接口,进行getConnection操作,进而进行查询操作。 显然这并不能支持刚才的设想,但是结论一定是正确的,就是因为事务隔离级别导致了Server A读到的永远是快照,发生了可重复读。 后来调整了一下思路,发现MySQL还有一个特性就是AutoCommit,即默认情况下,MySQL是开启事务的,下面表格能说明问题,表1: 但是,如果AutoCommit不是默认开启呢?结果就会变成下面的表格,表2:

MySQL 忘记密码:skip-grant-tables

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-10 04:52:07
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对 外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全 状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。 2.修改MySQL的登录设置: # vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock skip-grant-tables 保存并且退出vi。 3.重新启动mysqld # /etc/init.d/mysqld restart Stopping MySQL: [ OK ] Starting MySQL: [ OK ] 4.登录并修改MySQL的root密码 # /usr/bin/mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 3.23

SpringBoot时间戳与MySql数据库记录相差14小时排错

寵の児 提交于 2020-01-10 04:49:03
项目中遇到存储的时间戳与真实时间 相差14小时 的现象,以下为解决步骤. 问题 CREATE TABLE `incident` ( `id` int(11) NOT NULL AUTO_INCREMENT, `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `recovery_time` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4; 以上为数据库建表语句,其中 created_time 是插入记录时自动设置, recovery_time 需要手动进行设置. 测试时发现, created_time 为正确的北京时间,然而 recovery_time 则与设置时间相差14小时. 尝试措施 jvm时区设置 //设置jvm默认时间 System.setProperty("user.timezone", "UTC"); 数据库时区查询 查看数据库时区设置: show variables like '%time_zone%'; --- 查询结果如下所示: --- system_time_zone: CST --- time_zone:SYSTEM 查询 CST

永远不要在MySQL中使用UTF-8

余生颓废 提交于 2020-01-10 04:09:38
转自:Python之禅 译文:http://suo.im/4zBuvs 来自:http://ju.outofmemory.cn 最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrectstring value:‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“ <…”也是合法的UTF-8。 问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。 MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。 当然,他们并没有对新的字符集广而告之(可能是因为这个bug让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。 简单概括如下: 1、MySQL的“utf8mb4”是真正的“UTF-8”。 2、MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。 我要在这里澄清一下:所有在使用“utf8

mysql数据库安全加固

风格不统一 提交于 2020-01-10 04:05:46
数据库禁止root用户远程登录 登录数据库 use mysql; select host,user from user; 查看root用户的host是否为localhost,如果有host为%表示所有ip可以访问,执行 delete from user where user="root" and host="%"; 增加一个新用户管理数据库 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; username为用户名 host为%时表示所有,有可以使用172.20.0.0/255.255.0.0 password为用户密码 GRANT privileges ON databasename.tablename TO 'username'@'host'; privileges表示权限,包含SELECT , INSERT , UPDATE等,全部使用ALL 该命令授权的用户不能给其它用户授权,如果想让该用户可以授权使用 GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; SET PASSWORD FOR 'username'@'host' = PASSWORD('newpassword'); 修改用户密码

MySQL 主从配置

霸气de小男生 提交于 2020-01-10 03:51:23
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1、主从服务器分别作以下操作 : 1.1、版本一致 1.2、初始化表,并在后台启动mysql 1.3、修改root的密码 2、修改主服务器master: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段 3、修改从服务器slave: #vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[不是必须]启用二进制日志 server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段 4、重启两台服务器的mysql /etc/init.d/mysql restart 5、在主服务器上建立帐户并授权slave: #/usr/local/mysql/bin/mysql -uroot -pmttang mysql> GRANT REPLICATION SLAVE ON *.* to 'zxf330301'@'192.168.5.113' identified by '#zhangXF3303'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.5

mysql主从复制

冷暖自知 提交于 2020-01-10 02:24:15
mysql主从数据库配置 如何配置mysql主从数据库 首先确保主从服务器上的Mysql版本相同 主数据库服务器配置: 1. 修改主数据库的配置文件 my.ini, 修改之后重启 Mysql 服务。 [mysqld] port=3306 server-id=10 #与从数据库不同 log-bin=c:\log-bin.log #日志文件 binlog-do-db=tpceshi #这里设置需要在主服务器记录日志的数据库,只有在这里设置了的数据库才能被复制到从服务器 binlog-ignore-db=mysql #这里设置在主服务器上不记度日志的数据库 2. 打开 mysql 命令行登陆 mysql, , 设置一个从数据库的账户,给从数据库分配复制权限 mysql>GRANT REPLICATION SLAVE ON *.* TO slave001'@'192.168.0.99' IDENTIFIED BY '123456'; slave001: 用户名 192.168.0.99 :IP 123456 :密码 3.show masterstatus; 显示主数据库状态 File: 数据库日志文件 Position: 日志位置 这2个选项用于在从数据库服务器中配置 //////////////// 从数据库数据同步 //////////////// 好了,现在可以停止主数据的的更新操作

MySQL多实例

◇◆丶佛笑我妖孽 提交于 2020-01-10 00:41:11
什么是多实例 在一台服务器上运行 多个 数据库服务 为什么使用多实例 节约运维成本 提高硬件利用率 配置 1)安装软件 ] yum -y install libaio ] useradd mysql #用户名必须为mysql ] tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz #注意软件版本,需要支持多实例功能 ] mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql ] vim /root/.bashrc export PATH = $PATH :/usr/local/mysql/bin ] source /root/.bashrc 2)配置文件 ] vim /etc/my.cnf #新建 [ mysqld_multi ] #启用多实例 mysqld = /usr/local/mysql/bin/mysqld_safe #指定进程文件 mysqladmin = /usr/local/mysql/bin/mysqladmin #指定管理命令 user = root #指定进程用户 [ mysqld1 ] #实例进程名称,格式为mysqldX,X为数字编号 port = 3307 #端口号 datadir = /dir1 #数据库目录 socket = /dir1