InnoDB

mysql索引原理

戏子无情 提交于 2020-10-07 05:26:00
阅读目录   初识索引   索引的原理   索引的数据结构   聚集索引与辅助索引   MySQL索引管理   测试索引   正确使用索引   联合索引   查询优化神器-explain   慢查询优化的基本步骤   慢日志管理 返回顶部 一 初识索引 为什么要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。 什么是索引? 索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。 索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。 你是否对索引存在误解? 索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响。而索引太少,对查询性能又会产生影响,要找到一个平衡点,这对应用程序的性能至关重要。一些开发人员总是在事后才想起添加索引----我一直认为,这源于一种错误的开发模式。如果知道数据的使用,从一开始就应该在需要处添加索引

面试官:GET和POST两种基本请求方法有什么区别

橙三吉。 提交于 2020-10-07 05:18:06
点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 来源:r6d.cn/j26B GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。 当你在面试中被问到这个问题,你的内心充满了自信和喜悦。 你轻轻松松的给出了一个“标准答案”: GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。 GET请求会被浏览器主动cache,而POST不会,除非手动设置。 GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST么有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。 GET参数通过URL传递,POST放在Request body中。 (本标准答案参考自w3schools) “很遗憾,这不是我们要的回答!” 请告诉我真相.

MYSQL8在Ubuntu 18.04.3安装,索引,性能分析基本介绍

不问归期 提交于 2020-10-07 00:57:56
MYSQL MYSQL架构介绍 MYSQL简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。 MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这就增加速度并提高了灵活性。 MYSQL安装 安装 在 Ubuntu 18.04.3下安装mysql8 wget https://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb sudo apt install mysql-server mysql -u root -p select host, user, authentication_string, plugin from mysql.user; MYSQL用户与权限管理 MYSQL用户管理 1.创建用户 创建hb用户,密码123 create user 'hbx'@'%' identified with mysql_native_password by '123'; 创建hb用户,ip:192.118.1.1,密码123 create user 'hb'@'192.118.1.1' identified by '123'; 创建ip:192

mysql 事务日志 

|▌冷眼眸甩不掉的悲伤 提交于 2020-10-07 00:50:57
Redo Log 1.redo分为Physical Redo Log与Logical Redo Log 2.用于在 crash recovery时已提交没有刷盘的事务(记录时间点为缓冲中页面修改完成,但还没有刷新到硬盘,即事务提交之前),如异常宕机 2.redo日志大部分为物理日志,包括 ib_logfile0 and ib_logfile1两个文件 3.MySQL以循环方式写入重做日志文件。重做日志中的数据根据受影响的记录进行编码;LSN的不断增加也是通过redo log 的改变实现的 4.聚集索引、二级索引、undo页面的修改,均需要记录Redo日志。 undo Log 1.对单个读写事务的记录集合,用于回滚clustered index(cluster index 与主键关系统) record,其他读事务需要查原始记录(没有修改的数据)时,从undo记录中查(为确保事务的一致性), 2.undo log以undo log segment存在于rollback segments中, rollback segments存在于 system tablespace, undo tablespaces, 或temporary tablespace. 3. temporary tablespace中的undo ,用于用户定义的临时表,由于临时表不需求恢复

二进制安装安装mysql 8.0.20

坚强是说给别人听的谎言 提交于 2020-10-07 00:48:58
MySQL最新版本8.0.20正式发布。与之前8.0的系列版本一样,这次的发行版除了包含缺陷修复,也同样包括新功能。下面快速浏览一下。关键字:hash join、InnoDB双写缓冲、二进制日志事务压缩。 下载mysql8.0.20二进制安装包 环境:centos7 打开mysql官方下载链接 https://dev.mysql.com/downloads/mysql/ 然后选择操作系统为linux通用、结构是X86,64二进制安装包 将二进制安装包上传至Linux服务器 #下载相关依。 [15:12:04 root@a7 ~]#yum -y install make gcc-c++ cmake bison-devel ncurses-devel readline-devel libaio-devel perl libaio wget lrzsz vim libnuma* bzip2 xz #关闭selinux [15:35:17 root@a7 ~]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config [15:35:51 root@a7 ~]#setenforce 0 setenforce: SELinux is disabled #创建mysql用户并创建分组 [16:12:37 root@a7

MySQL的七种join

守給你的承諾、 提交于 2020-10-06 09:02:48
建表 在这里呢我们先来建立两张有外键关联的张表。 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206` . `tbl_dept` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR ( 30 ), `locAdd` VARCHAR ( 40 ), PRIMARY KEY ( `id` ) ) ENGINE = INNODB CHARSET =utf8; CREATE TABLE `db0206` . `tbl_emp` ( `id` INT ( 11 ) NOT NULL AUTO_INCREMENT, `name` VARCHAR ( 20 ), `deptId` INT ( 11 ), PRIMARY KEY ( `id` ), FOREIGN KEY ( `deptId` ) REFERENCES `db0206` . `tb_dept` ( `id` ) ) ENGINE = INNODB CHARSET =utf8; /*插入数据*/ INSERT INTO tbl_dept(deptName,locAdd) VALUES ( 'RD' , 11 ); INSERT INTO tbl_dept(deptName,locAdd) VALUES

排查Mysql突然变慢的一次过程

☆樱花仙子☆ 提交于 2020-10-06 06:56:07
排查Mysql突然变慢的一次过程 本文源地址: 排查Mysql突然变慢的一次过程 上周客户说系统突然变得很慢,而且时不时的蹦出一个 404 和 500 ,弄得真的是很没面子,而恰巧出问题的时候正在深圳出差,所以一直没有时间 看问题,一直到今天,才算是把问题原因找到。 定位问题 刚开始得到是系统慢的反馈,没有将问题点定位到数据库上,查了半天服务是否正常(因为之前有一次Dubbo内存泄漏)。 在将应用服务日志查看了一遍后,没有发现任何异常,只是打了几个警告的日志。 于是又查看了业务运行时的日志,看到日志都提示了一个 Lock wait timeout exceeded; try restarting transaction 的异常。 这时还是没有将重心放到数据库上,认为是代码的原因,导致事务一直没有提交。 重新将代码审阅了一遍,觉得应该不是代码逻辑的问题,而这个时候, Lock wait timeout exceeded; try restarting transaction 这个异常的日志越来越多。 认为是数据库层面出了问题,开始排查数据库。 寻找原因 由于我们的数据库不是用的 云RDS版本 ,是在一台8核32G的AWS上的安装版本。 使用 top 命令,查看到 Mysql 占用的 CPU 使用率高达 90% 左右。 心里一慌,感觉不妙,这样子高负载的CPU使用率

MySQL

家住魔仙堡 提交于 2020-10-06 06:53:23
一、MySQL 性能优化的维度 硬件: CPU、内存、存储、网络设备等 系统配置: 服务器系统、数据库服务参数等 数据库表结构: 高可用、分库分表、读写分离、存储引擎、表设计等 SQL 及 索引: SQL 语句优化、索引使用等 二、查询优化 1. 慢查询 慢查询开启日志 慢查询分析 2. Explain 帮助开发人员分析 SQL 问题 id:查询序列号 select_type:表示查询的类型 simple:简单的查询 primary:最外面的select union: dependent union: union result :union 的结果 subquery:子查询的第一个select dependent subquery:子查询的第一个select,取决于外面的查询 derived:导出表的 select table:查询数据是关于哪张表 type:区间索引,显示连接用了何种类型,最好到最差的连接类型(至少达到range,最后达到 ref) system const:数据表最多只有一个匹配行,因为只匹配一行数据,所以很快 eq_ref:使用=比较带索引的列 ref:可用于 = 或 < 或 > 操作符的带索引的列 ref_or_null index_merge unique_subquery index_subquery range:只检索给定范围的行,使用一个索引来选择行

码农必备SQL高性能优化指南!35+条优化建议立马get

寵の児 提交于 2020-10-06 03:11:21
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL 的一些进阶使用技巧 SQL 的优化方法 SQL 的书写规范 在介绍一些技巧之前,有必要强调一下规范,这一点我发现工作中经常被人忽略,其实遵循好的规范可读性会好很多,应该遵循哪些规范呢 1、 表明要有意义,且标准 SQL 中规定表名的第一个字符应该是字母。 2、注释,有单行注释和多行注释,如下 多行注释很多人不知道,这种写法不仅可以用来添加真正的注释,也可以用来注释代码,非常方便 3、缩进 就像写 Java,Python 等编程语言一样 ,SQL 也应该有缩进,良好的缩进对提升代码的可读性帮助很大,以下分别是好的缩进与坏的缩进示例 4、空格 代码中应该适当留有一些空格,如果一点不留,代码都凑到一起, 逻辑单元不明确,阅读的人也会产生额外的压力,以下分别是是好的与坏的示例 5、大小写 关键字使用大小写,表明列名使用小写,如下 花了这么多时间强调规范,有必要吗,有!好的规范让代码的可读性更好,更有利于团队合作,之后的 SQL 示例都会遵循这些规范。 SQL 的一些进阶使用技巧 1、巧用 CASE WHEN 进行统计 来看看如何巧用 CASE WHEN 进行定制化统计,假设我们有如下的需求

补12.关于mysql的外键约束

走远了吗. 提交于 2020-10-05 19:24:39
一、什么是mysql中的外键(froeign key) 假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key)。 在子表中增加一条记录时,需要确定是否有与父表相对应的记录。 如果父表没有对应的记录,那么子表(从表)无法插入这条数据。 下面是一个关于外键的示例: 1.首先创建一个主表,这个主表存放了班级信息。 create table class ( id TINYINT PRIMARY KEY auto_increment, class_name varchar(20)) engine=innodb; 2.在class表中插入五条记录,代表有5个班级。 insert into class (id,class_name)value(1,"class1"), (2,"class2"), (3,"class3"), (4,"class4"), (5,"class5"); 3.创建一个子表,这个子表存放了学生和班级的对应关系,这些学生属于哪个班级? create table student( id int primary key auto_increment, name varchar(20), class_id TINYINT) engine=innodb; 4.插入6条记录,代表了6个学生。 insert into student(id