sql优化

MySQL之explain使用

♀尐吖头ヾ 提交于 2020-03-12 08:28:16
是什么 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。 用法:explain+sql语句 explain之id id是以数字形式呈现,表示查询中执行select子句或操作表的顺序。数字越大,优先级越高,优化器优先执行。 id相同,从上往下顺序执行 id不同,id值越大,优先级越高,越先执行。 explain之select_type select_type表示查询的类型,主要是用来区别普通查询、联合查询、子查询等复杂查询。主要有以下几种: SIMPLE:简单的select查询,查询中不包含子查询或者UNION PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY SUBQUERY:在select或WHERE列表中包含了子查询。 DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。 UNION:若第二个SELECT出现在UNION之后则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED。 UNION RESULT:从UNION表获取结果的SELECT。 explain之table 显示这一行的数据是关于哪张表的! explain之type type显示查询使用了何种类型

mybatis与hibernate对比

拥有回忆 提交于 2020-03-12 04:54:53
第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择 mybatis 就会加快许多,而且语句的管理也比较方便。 第二方面:开发工作量的对比 Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。 第三方面:sql优化方面 Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的

mysql主从原理

眉间皱痕 提交于 2020-03-12 03:32:59
1.1 mysql主从同步    参考博客: https://www.cnblogs.com/kevingrace/p/6256603.html   1、mysql主从同步(复制)概念       1. 将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的。       2. 复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。       3. 主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。       4. 当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。       5. 从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。        binlog: 是二进制日志文件,用于记录mysql的数据更新或者潜在更新(比如DELETE语句执行删除而实际并没有符合条件的数据)   2、Mysql支持哪些复制       1. 基于语句的复制: 在主服务器执行SQL语句,在从服务器执行同样语句。        注: MySQL默认采用基于语句的复制,效率较高。一旦发现没法精确复制时, 会自动选基于行的复制。       2. 基于行的复制: 把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持       3.

Mysql性能优化

巧了我就是萌 提交于 2020-03-12 03:01:34
1.1 Mysql数据库的优化技术   1、mysql优化是一个综合性的技术,主要包括       1. 表的设计合理化(符合3NF)       2. 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]       3. 分表技术(水平分割、垂直分割)       4. 读写[写: update/delete/add]分离       5. 存储过程 [模块化编程,可以提高速度]       6. 对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]       7. mysql服务器硬件升级       8. 定时的去清除不需要的数据,定时进行碎片整理(MyISAM)   2、要保证数据库的效率,要做好以下四个方面的工作       1. 数据库设计       2. sql语句优化       3. 数据库参数配置       4. 恰当的硬件资源和操作系统       此外,使用适当的存储过程,也能提升性能。       这个顺序也表现了这四个工作对性能影响的大小 1.2 数据库表设计   1、通俗地理解三个范式        第一范式: 1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF)        第二范式: 2NF是对记录的惟一性约束,要求记录有惟一标识

MyBatis 源码分析-项目总览

筅森魡賤 提交于 2020-03-12 02:43:33
MyBatis 源码分析-项目总览 1.概述 本文主要大致介绍一下MyBatis的项目结构。 引用参考资料《MyBatis技术内幕》 此外, https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰到一些问题,可以参考一下。 2.模块划分 MyBatis在项目模块划分还是很清晰的。各个模块层次以及具体作用,如下: 模块 层次 定义 session 接口层 提供给外部使用的接口API scripting 核心处理层 解析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。 mapping 核心处理层 映射 builder 核心处理层 配置解析 executor 核心处理层 执行器模块,串联整个执行流程。 plugin 核心处理层 插件模块:提供插件接口,通过自定义插件方式对MyBatis进行拓展 cursor 核心处理层 游标模块 reflection 基础支持层 反射模块:mybatis专门对反射模块进行封装。提供更加简单易用的API type 基础支持层 类型转换模块:Mybatis为简化配置提供了别名机制。提供java类型与JDBC类型转换 logging 基础支持层 日志模块:主要是集成第三方日志 io 基础支持层 资源加载模块:对类加载器进行了封装。确定类加载器顺序

mysql 学习笔记 01

孤街醉人 提交于 2020-03-11 23:29:43
知识大纲 客户端查询请求流程 先来看客户端运行一条查询 sql 会经过哪些流程: mysql 基本组成结构 从上面的图中可以看出,mysql 大致由 server 层 和 存储引擎层组成。 为了管理方便,mysql 把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 server 层的功能,把真实存取数据的功能划分为存储引擎的功能。 下面详细说明下各个模块的功能: 一、server server 层又分别由 连接器、查询缓存、分析器、优化器、执行器组成。 1.1 连接器 mysql 是 C/S 架构,每当有一个客户端连接到服务器时,服务器都会创建一个线程来专门处理与这个客户端的交互。 客户端和服务端的连接方式总共有三种。 TCP/IP 命名管道和共享内存(Windows 系统, 客户端和服务端 必须在同一台机器) Unix 域套接字文件(类Unix 系统,客户端和服务端 必须在同一台机器) 注意: 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。 也就是说即使管理员在此时修改了用户的数据库权限,只有用户重新建立连接才会生效。 当客户端与服务端建立连接后,客户端就会以文本消息的方式与服务端通信(CRUD)。服务端接收到消息后(比如一个查询请求),还要进行一系列处理,才能返回数据给客户端

sql优化

假如想象 提交于 2020-03-11 17:56:34
5.1 方式一:explain 筛选出有问题的 SQL,我们可以使用 MySQL 提供的 explain 查看 SQL 执行计划情况(关联表,表查询顺序、索引使用情况等)。 用法: explain select * from category; 返回结果: mysql> explain select * from category; +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | category | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 |

MYSQL 逻辑架构

我们两清 提交于 2020-03-11 17:48:56
MYSQL 逻辑架构 思维导图 前言 》 Mysql并非尽善尽美,但足够灵活,能适应高要求环境,如Web应用。 》 Mysql在众多平台上运行良好,支持多种数据类型,但不支持对象类型(Mongodb支持) 》 Mysql的存储引擎可以基于表建立,以满足对数据存储,性能,特征及其他特性的各种需要。 架构逻辑视图 每个虚线框为一层,总共三层。 第一层,服务层(为客户端服务):为请求做连接处理,授权认证,安全等。 第二层,核心层:查询解析,分析,优化,缓存,提供内建函数;存储过程,触发器,视图。 第三层,存储引擎层,不光做存储和提取数据,而且针对特殊数据引擎还要做事务处理。 连接管理与安全性(第一层 服务层) > 处理流程 Δ 每个连接的查询都在一个进程中的线程完成。 Δ 服务器负责缓存线程,所以服务层不需要为每个连接新建线程。 > 认证流程    优化与执行 > 在解析查询之前,服务器会“询问”是否进行了查询缓存(只能缓存SELECT语句和相应结果)。缓存过的直接返回结果,未缓存的就需要进行解析查询,优化,重新执行返回结果。 > 解析查询时会创建一个内部数据结构(树),然后对其进行各种优化。 > 优化:重写查询,决定查询的读表顺序,选择需使用的索引。 思维导图 前言 》 Mysql并非尽善尽美,但足够灵活,能适应高要求环境,如Web应用。 》 Mysql在众多平台上运行良好

MySQL优化(6):分表和读写分离

╄→尐↘猪︶ㄣ 提交于 2020-03-11 17:28:32
分表 通常指:通过应用程序层,将数据划分到不同的表中进行存储 对比分区,分区是在服务器层完成的分区算法 分表会导致客户端明显的改变,在服务器端出现结构相同的多张表,甚至可以把多张表分到不同的服务器上 以账单表为例:数据库可能会有这样的情况 create table bill201710( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int ); create table bill201711( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int ); create table bill201712( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int ); 而是又Java等代码进行处理,区分应该选择哪一张表,根据传递的时间参数进行划分 实际中,有一个比较麻烦的问题, 主键ID的问题 ,理论上ID是不可以重复的 解决方案: (1)代码层面,手动做一个自增ID,不稳妥

SQL注入详解

↘锁芯ラ 提交于 2020-03-11 17:02:08
今天跟大家分享SQL注入的知识。 前言 先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。 1 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。 SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。 这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。 SQL数据库操作示例: import sqlite3 连接数据库: conn = sqlite3 . connect ( 'test.db' ) 建立新的数据表: conn . executescript ( '' 'DROP TABLE IF EXISTS students ; CREATE TABLE