sql优化

100道MySQL常见面试题总结

余生颓废 提交于 2020-02-08 20:07:25
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点. 此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案. 索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B

【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计

♀尐吖头ヾ 提交于 2020-02-08 15:47:29
一、MySQL还是个黑盒子 我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了。 可是我们并不知道 MySQL 里面是怎么执行的,例如我们执行了 insert 语句,只知道表里面多了一条数据,MySQL 是怎么插入的我们就不知道了。 二、解开 MySQL 这个黑盒子 1、一条工作线程: 举例: 我们都知道,在 Socket 编程里,ServerSocket 会有一条线程负责监听 Socket 发送过来的网络请求,并且负责从网络请求里读取请求数据,然后再进行处理 。 原理: 那么在 MySQL 里也是一样的道理,会有一条 工作线程 专门去监听 MySQL 数据库连接池里的网络请求,并且负责将请求中的 SQL 读取出来。 2、 SQL 接口: 上面说到 MySQL 的工作线程会从网络连接中读取 SQL。但是接下来是由谁继续执行呢? 举例: 我们可以想象一下,在我们的 Web 系统里头,Tomcat 这个进程会接收客户端的网络请求,然后经过转发交给我们写的接口执行。 举例: 在 MySQL 里其实也一样,MySQL 就是一个数据库管理系统,上面提及到的工作线程会接收各个客户端的网络请求,然后经过转发交给内部的接口执行。 而这里的内部接口,叫 SQL 接口 ,它是 MySQL 内部里的一个组件。它是一套执行 SQL

MySQL(二)之B-Tree和B+Tree

别来无恙 提交于 2020-02-08 15:38:04
B-Tree 叶节点具有相同的深度,叶节点的指针为空 所有索引元素不重复 节点中的数据索引从左到右递增排列 由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。 例如一个度为d的B-Tree,设其索引N个key,则其树高h的上限为logd((N+1)/2),检索一个key,其查找节点个数的渐进复杂度为O(logdN)。从这点可以看出,B-Tree是一个非常有效率的索引数据结构。 另外,由于插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质. B+Tree(B-Tree变种)(mysql索引存储结构) 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引 叶子节点包含所有索引字段 叶子节点用指针连接,提高区间访问性能 为什么根节点不存储数据,叶子节点存储数据? 希望树的横向(根节点)能存储更多的索引,将具体的数据存储到叶子节点上 InnoDB一棵B+树可以存放多少行数据 ? 一般主键为bigint为8 Byte,指针为6 Byte,InnoDB存储引擎最小储存单元为页(Page),一个页的大小是16KB,16KB (16

MySQL.. ERROR! The server quit without updating PID file问题解决

荒凉一梦 提交于 2020-02-08 12:32:01
不小心将服务器OS给重启了,再启动数据库的时候,出现了很奇怪的问题 [root@dev run]# service mysql restart ERROR! MySQL server PID file could not be found! Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/run/mysql.pid). 无法启动mysql,后来上网找了一下解决方法,无非就是以下几种 1. 注释/etc/my.cnf里的skip-federated注释掉即#skip-federated; 2. my.cnf文件配置过高,重新定义其中的参数(根据服务器情况定义); 3. 杀掉mysql_safe和mysqld进程,然后再重启; 4. 当前日志文件过大,超出了my.cnf中定义的大小(默认为64M),删除日志文件再重启; 但是在主机中: 1. 注释中无skip-federated这个选项 2. My.cnf是自己优化过的,断电之前正常使用,不是这个的问题 3. Ps –ef | grep mysql 根本就没有mysql的僵尸进程 4. 没有这个问题 基本上网上的所有方式都试过了,都无法解决问题,然后在数据库的data目录(mysql/data)查看错误日志

day35-存储引擎及创建表的约束

妖精的绣舞 提交于 2020-02-08 11:09:06
一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。 二 mysql支持的存储引擎 MariaDB [(none)]> show

SQL学习笔记

浪子不回头ぞ 提交于 2020-02-08 10:33:17
目录 SQL(Structured Query Language)学习笔记 Terminal登录数据库 SQL特性 SQL约束 SQL索引 触发器 SQL优化执行计划 索引唯一扫描(index unique scan) 索引范围扫描(index range scan) 索引全扫描(index full scan) 索引快速扫描(index fast full scan) 检索数据 排序检索数据 过滤数据(字符需要用'' 数值不需要'') 通配符过滤数据 拼接字段(||) SQL函数 分组 select执行顺序 子查询 联结 等值联结/内联结 自联结 自然联结 外联结 组合查询 UNION SQL(Structured Query Language)学习笔记 Terminal登录数据库 1.登录 mysql -u root -p ; 2.显示所有数据库 show databases ; 3.使用数据库 use “database name” ; 4.显示数据库中所有表 show tables; 5.删除表 drop table ”Customers“; SQL特性 SQL约束 1.主键 CREATE TABLE OrderItems ( order_num int NOT NULL PRIMARY KEY, order_item int NOT NULL , prod_id char

mysql的 视图、触发器、事务、存储过程、函数、索引与慢查询优化

試著忘記壹切 提交于 2020-02-08 04:32:37
视图假设有两张表学生和老师,学生表(sid,name,tid)关联老师表(tid,tname)创建视图的语法: create view 视图名 as SQL语句 实例:create view student2teacher as select * from student inner join teacher on student.tid=teacher.tid; 创建视图后会产生一个名为 student2teacher 的表,可以直接调用。 思考:开发过程中会不会去使用视图? 不会!视图是mysql的功能,如果你的项目里面大量的使用到了视图,那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改, 意味着你需要先在mysql这边将视图先修改一下,然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图, 而是通过重新修改sql语句来扩展功能 强调 1、在硬盘中,视图只有表结构文件,没有表数据文件 2、视图通常是用于查询,尽量不要修改视图中的数据 然后说一个关于删除视图的方法 语法:DROP VIEW 视图名称 DROP VIEW student2teacher 触发器 在某张表对数据进行增删改时自动触发的功能称之为触发器 这类行为一旦执行了就会触发触发器的执行,自动运行另一段的sql代码 创建触发器的语法 # 创建两张表create

Atlas-MySQL

我的未来我决定 提交于 2020-02-08 04:29:12
优秀DBA的素质 1 、人品,不做某些事情 2 、严谨,运行命令前深思熟虑,三思而后行,即使是依据select 3 、细心,严格按照步骤一步一步执行,减少出错 4 、心态,遇到灾难,首先要稳住,不慌张,不要受到旁人的影响 5 、熟悉操作系统,Linux系统的工具和命令 6 、熟悉业务 ( 开发 ),编程语言 7 、熟悉行业 8 、喜欢数据库 • 什么是数据? 数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。 • 什么是数据库管理系统? 将大量的数据规范的管理在一起的软件 • 数据库管理系统种类 关系型和非关系型 • 关系型数据库的特点   – 二维表   – 典型产品 Oracle传统企业, MySQL是互联网企业   – 数据存取是通过SQL   – 最大特点,数据安全性方面强(ACID) • NoSQL:非关系型数据库(Not only SQL)   – 不是否定关系型数据库,做关系型数据库的的补充。   – 想做老大,先学会做老二。 RDBMS与NoSQL对比 • web1.0时代   企业提供内容,用户浏览,所以关系型数据库够用,并发并不高,所以不需要NoSQL。 • web2.0时代   核心是企业提供平台,用户参与提供内容。这时关系型数据库无法满足需求了。 • 2003

mysql数据库-索引-长期维护

╄→尐↘猪︶ㄣ 提交于 2020-02-08 02:32:35
############### 索引介绍 ############## """ 1. 索引介绍 需求: 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的, 也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。 说起加速查询,就不得不提到索引了。 索引: 简单的说,相当于图书的目录,可以帮助用户快速的找到需要的内容. 在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。能够大大提高查询效率。 特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 本质: 索引本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果, 同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 """ ############### 索引方法 ############## """ 2.索引方法 1. B+TREE 索引 B+树是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设计的一种平衡查找树, 在B+树中,所有的记录节点都是按键值大小顺序存放在同一层的叶节点中,叶节点间用指针相连,构成双向循环链表, 非叶节点(根节点、枝节点)只存放键值,不存放实际数据。 注意:通常其高度都在2

MyBatis(一)

泪湿孤枕 提交于 2020-02-08 01:12:29
一、MyBatis介绍 mybatis是一个 半ORM (Object Relational Mapping对象关系映射)持久层框架, 底层封装了JDBC ,开发只需关注SQL,无需处理加载驱动、创建连接等重复工作。 二、MyBatis优点 解耦 :直接编写SQL,解除SQL与程序代码的耦合; 动态SQL :提供xml标签,支持编写动态sql; 代码少 :减少代码量,不需要手动加载驱动、创建连接等处理过程; 性能好 :直接编写原生态sql,严格控制sql执行性能,灵活度高。 兼容各种数据库 :MyBatis底层使用JDBC来连接数据库,只要JDBC支持的数据库MyBatis都支持; 集成spring ; 对象与字段映射 :提供映射标签,支持对象与数据库的ORM字段关系映射;提供了关系映射标签,支持对象关系组件维护。 三、MyBatis缺点 编写 大量SQL 语句,需要对sql有一定理解; 数据库 移植性差 :SQL语句依赖于数据库,不能随便更换数据库。 四、MyBatis与Hibernate区别 区别 MyBatis Hibernate 框架 半ORM框架 全ORM框架 优点 编写原生态sql,直接对sql性能优化,灵活度高,与代码解耦 对象关系映射能力强,平台无关性好 缺点 需编写大量sql,不支持数据库无关性 不能自主对sql优化,设置映射需考虑性能与对象模型的权衡 适用项目