sql优化

深入理解MySQL索引

做~自己de王妃 提交于 2020-03-18 13:26:59
前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重。 可能你了解索引的底层是b+树,会加快查询,也会在表中建立索引,但这是远远不够的,这里列举几个索引常见的面试题: 1、索引为什么要用b+树这种数据结构? 2、聚集索引和非聚集索引的区别? 3、索引什么时候会失效,最左匹配原则是什么? 当遇到这些问题的时候,可能会发现自己对索引还是一知半解,今天我们一起学习MySQL的索引。 一、一条查询语句是如何执行的 首先来看在MySQL数据库中,一条查询语句是如何执行的,索引出现在哪个环节,起到了什么作用。 1.1 应用程序发现SQL到服务端 当执行SQL语句时,应用程序会连接到相应的数据库服务器,然后服务器对SQL进行处理。 1.2 查询缓存 接着数据库服务器会先去查询是否有该SQL语句的缓存,key是查询的语句,value是查询的结果。如果你的查询能够直接命中,就会直接从缓存中拿出value来返回客户端。 注:查询不会被解析、不会生成执行计划、不会被执行。 1.3 查询优化处理,生成执行计划 如果没有命中缓存,则开始第三步。 解析SQL:生成解析树,验证关键字如select,where,left join 等)是否正确。 预处理:进一步检查解析树是否合法,如检查数据表和列是否存在

MySql的读写分离

谁都会走 提交于 2020-03-18 11:00:06
数据量增多,单机的数据库不足以支撑业务,需要用到数据库集群。而读写分离,就是将数据库的读和写分离,对应到数据库一般就是主从数据库,一主一从或者一主多从;业务服务器把数据写到主数据库中,读操作都去从库读;主库会同步数据到从库,保证数据的一致性。 主从集群 这种集群方式,就是将访问的压力从主库转移到从库,单机的数据库不能支撑并发读写的时候,而且读的请求很多的情况下就适合数据库集群。如果写的操作很多的话,那就不适合这种集群方式,因为写的时候是写入主库,主库的压力还是没有变化,同时同步到从库也需要消耗资源。 单机的时候,一般数据库优化就是加索引,但是加了索引对查询有优化,但是写入的时候会有影响,因为写入的数据库不会更新索引。所以在主从数据库中,可以单独的对读库(从数据库)做索引,而写库(主数据库)可以减少缩影而提高写的效率。 但是主从数据库中需要注意: 主从同步延迟、分配机制的考虑 主从同步延迟 二次读取 一般操作是,在从库读取数据时,没有读到数据,就去主库进行数据读取。但是这种操作还是将读的压力返还给主库,如果有恶意的攻击,主库就爆了。 一般情况下,通过对数据库访问的API进行封装就能实现这个功能,业务之间没有耦合。 写了之后的马上读操作操作主库 在写了数据后,立马读操作就去访问主库,之后的读操作访问从库,这种业务上会有高度耦合。 根据业务,将重要的业务数据的读写都放在主库

高性能MySQL 第一章 mysql架构与历史

人盡茶涼 提交于 2020-03-18 10:44:43
mysql的存储引擎架构把查询处理及其他系统任务和数据的存储/提取相分离 1.1 mysql逻辑架构   第一层:链接处理、授权认证、安全等大多数基于网络的工具或者服务都有类似的架构   第二层:核心服务,查询解析、分析、优化、缓存、所有的内置函数(日期、时间等),所有跨存储引擎的功能,存储过程、触发器、视图等   第三层:存储引擎,负责数据的存储和提取   1.1.1 连接管理与安全性     每个客户端连接都会在服务器进程中拥有一个线程,服务器会缓存线程,   1.1.2 优化与执行     mysql会解析查询,并创建解析书,然后优化。     在查询之前,会先检查查询缓存 1.2 并发控制   1.2.1 读写锁     读锁和写锁     1.2.2 锁颗粒       表锁:       行级锁:可以最大程度的支持并发,只在存储引擎层实现 1.3 事务   原子性、一致性、隔离性、持久性   1.3.1 隔离级别     未提交读:事务的修改,即使没有提交,对其他事务也都是可见的。脏读     提交读:一个事务只能看见已经提交的事务的修改。不可重复读     可重复读:保证了同一个事务中多次读取同样记录的结果是一致的,mvcc,mysql默认隔离级别     可串行化:强制事务串行执行   1.3.2 死锁     各种死锁检测和死锁超时机制

Amazon EC2安装mysql多实例并配置主从复制

若如初见. 提交于 2020-03-18 08:04:44
1、MySQL安装: EC2直接使用yum安装mysql非常方便: yum install mysql mysql-server mysql-libs 此处安装了三个包 完事之后能够直接使用 service mysqld start 启动mysql服务 改动root密码: mysqladmin -u root -p password “root” 2、使用mysqld_multi安装多实例mysql: vim /etc/my.cnf 加入实例的配置信息 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid 以上是默认的配置信息,在mysqld下加入例如以下配置: #开启慢查询日志, 记录查询过长的 sql 语句。以便于优化 log_slow_queries=/var/log/mysql/mysql-slow.log #开启 bin-log 日志,不用log-bin=xxx。试验时这样子无法启动mysql服务,不知为何 log-bin #分配serverid。不要和以下的从服务器冲突就可以 server-id=1

mysql的多实例安装

余生颓废 提交于 2020-03-18 08:04:17
单机多实例据说可以最大程度提高硬件使用,谁知道呢,但是以前的公司喜欢这样搞,我最近也在学习复制什么的,电脑搞不起两台虚拟机,刚好单机多实例可以解救我。下面就说说步骤。 承上文http://www.cnblogs.com/wingsless/p/4002806.html,我已经安装好了MySQL,不过这个是单实例的,要更改也可以,但是担心会出现问题,于是我将下面的东西删掉: 1 #rm -f /etc/init.dmysql 2 $rm -f /home/mysql/data 建立这么几个目录: $mkdir -p /home/mysql/mydata/data1/binlog /home/mysql/mydata/data1/relay_log /home/mysql/mydata/data1/socket $mkdir -p /home/mysql/mydata/data2/binlog /home/mysql/mydata/data2/relay_log /home/mysql/mydata/data2/socket 接下来就可以将$MYSQL_HOME/suppuort-files/my-default.cnf复制到/etc下: #cp suppuort-files/my-default.cnf /etc/my.cnf 修改这个文件,增加下面的内容: [mysqld

sql语句应考虑哪些安全性?

人走茶凉 提交于 2020-03-18 08:02:58
简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析? (1)尽量选择较小的列; (2)将where中用的比较频繁的字段建立索引; (3)select中避免使用*; (4)避免在索引列上使用计算、not in和<>等操作; (5)当只需要一行数据时候使用limit1; (6)保证单表数据不超过200w,实时分割表; 针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况。 sql语句应考虑哪些安全性? (1)少使用root账户,应该为不同的动作分配不同的账户; (2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户。防止泄露服务器和数据库相关信息; (3)防止sql注入,对特殊字符进行转义、过滤或者使用预编译的sql语句绑定变量 接下来重点说下Mysql半同步复制, 从MySQL5.5开始,MySQL以插件的形式支持半同步复制 。先来区别下mysql几个同步模式概念: 异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。 全同步复制(Fully synchronous

MySQL 5.7 深度解析: 半同步复制技术

不问归期 提交于 2020-03-18 07:52:56
复制架构衍生史 在谈这个特性之前,我们先来看看MySQL的复制架构衍生史。 MySQL的复制分为四种: 普通的replication,异步同步。 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。 semi-sync replication,半同步。性能,功能都介于异步和全同步中间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。 sync replication,全同步。目前官方5.7基于Group replication的全同步技术处在labs版本,离正式集成已经不远。全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。 mysql cluster。 基于NDB引擎,搭建也简单,本身也比较稳定,是mysql里面对数据保护最靠谱的架构,也是目前唯一一个数据完全同步的架构,数据零丢失。不过对业务比较挑剔,限制也较多。 半同步复制 我们今天谈论第二种架构。我们知道,普通的replication,即mysql的异步复制,依靠mysql二进制日志也即binary log进行数据复制。比如两台机器,一台主机(master),另外一台是从机(slave)。 正常的复制为:事务一(t1)写入binlog buffer;dumper

有效配置MySQL参数

喜夏-厌秋 提交于 2020-03-18 07:15:22
1 .获取当前配置参数 要优化配置参数,首先要了解当前的配置参数以及运行情况。使用下列命令可以获得目前服务器使用的配置参数: mysqld –verbose –help mysqladmin variables extended-status –u root –p 在 MySQL 控制台里面,运行下列命令可以获取状态变量的值: mysql> SHOW STATUS; 如果只要检查某几个状态变量,可以使用下列命令: mysql> SHOW STATUS LIKE ‘[ 匹配模式 ]’; ( 可以使用 % 、 ? 等 ) 2 .优化参数 参数优化基于一个前提,就是在我们的数据库中通常都使用 InnoDB 表,而不使用 MyISAM 表。 在优化 MySQL 时,有两个配置参数是最重要的,即 table_cache 和 key_buffer_size 。 table_cache table_cache 指定表高速缓存的大小。 每当 MySQL 访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值 Open_tables 和 Opened_tables ,可以决定是否需要增加 table_cache 的值。如果你发现 open_tables 等于 table_cache ,并且 opened_tables 在不断增长

Java之JDBC

▼魔方 西西 提交于 2020-03-18 05:36:50
JDBC的全称为:Java DataBase Connectivity(Java数据库连接)。 是一种执行SQL语句的Java API,可以为多种关系型数据库提供统一的访问。 1.JDBC的API (1)JDBC入门 package com.imooc.jdbc.demo1; import com.mysql.cj.jdbc.Driver; import java.sql.*; public class JDBCDemo1 { public void demo1() throws SQLException { //这里需要接受异常 //1.加载驱动 DriverManager.registerDriver(new Driver()); //2.获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://18.0.51.10:3306/jdbctest","root","123456"); //3.创建执行SQL语句的对象 String sql = "select * from user"; Statement stmt = conn.createStatement(); //4.执行sql语句 ResultSet resultSet = stmt.executeQuery(sql); while

程序员看了都要收藏系列:Mysql进阶知识干货笔记!

房东的猫 提交于 2020-03-17 22:54:17
一、SQL执行顺序以及常见SQL的join查询 sql执行顺序 : 手写 SELECT DISTINCT <select_list> FROM <left table> <join type> JOIN <right_table> ON <join_codition> WHERE <where_condition> HAVING <having_condition> ORDER BY < order_by_condition> LIMIT < limit number> 机读顺序 1 FROM <left_table> 2 ON <join_condition> 3 <join_type> JOIN <right_table> 4 WHERE <where_condition> 5 GROUP BY <group by_list> 6 HAVING <having_condition> 7 SELECT 8 DISTINCT <select_list> 9 ORDER BY <order_by_condition> 10 LIMIT <limit_number> sql机器执行顺序 七种join关系 二、索引 1、什么是索引 索引是帮助MYSQL高效获取数据的数据结构-->排好序的快速查找数据结构 我们平时所说的索引,没有特别指明,都是指B树(多路搜索树,不一定是二叉)