sql优化

mysql调优之索引——ORDER BY(GROUP BY)

别说谁变了你拦得住时间么 提交于 2020-01-17 19:03:45
order by 的排序优化 1、 ORDER BY 子句尽量使用index方式排序,避免使用filesort方式排序。 2、ORDER BY 满足两种方式会使用index方式排序: order by使用索引最左前列 使用where 子句与order by 子句条件列组合满足索引最左前列 3、如果不在索引列上,filesort有两种算法,mysql就要启动双路和单路排序. 双路排序 (1)mysql4.1之前是使用双路排序,两次扫描磁盘,最终得到数据,读取行指针和order by列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从数据库列表中读取对应的数据输出。 (2)从磁盘读取字段,在buffer中进行排序,再从磁盘取其他字段。 (3)取一批数据,要扫描两次磁盘,进行两次I/O操作,由于I/O操作很耗时,索引在4.1之后采用另一种算法,单路排序。 单路排序 从磁盘中读取查询所需要的列,按照order by列在buffer进行排序,然后扫描排序后的列表进行输出,它的效率更高一点,避免了第二次读取数据。并且随机I/O变成了顺序I/O,但是它会使用更大的内存空间,因为它把数据都保存在内存当中。 注意 在sort buffer中,单路排序比双路排序使用了更多的内存空间,因为单路排序把所有字段都取出,所有有可能导致取出的数据总大小超出sort_buffer的容量

小米流式平台架构演进与实践

旧巷老猫 提交于 2020-01-17 17:12:19
小米业务线众多,从信息流,电商,广告到金融等覆盖了众多领域,小米流式平台为小米集团各业务提供一体化的流式数据解决方案,主要包括数据采集,数据集成和流式计算三个模块。目前每天数据量达到 1.2 万亿条,实时同步任务 1.5 万,实时计算的数据 1 万亿条。 伴随着小米业务的发展,流式平台也经历三次大升级改造,满足了众多业务的各种需求。最新的一次迭代基于 Apache Flink,对于流式平台内部模块进行了彻底的重构,同时小米各业务也在由 Spark Streaming 逐步切换到 Flink。 背景介绍 小米流式平台的愿景是为小米所有的业务线提供流式数据的一体化、平台化解决方案。具体来讲包括以下三个方面: 流式数据存储 :流式数据存储指的是消息队列,小米开发了一套自己的消息队列,其类似于 Apache kafka,但它有自己的特点,小米流式平台提供消息队列的存储功能; 流式数据接入和转储 :有了消息队列来做流式数据的缓存区之后,继而需要提供流式数据接入和转储的功能; 流式数据处理 :指的是平台基于 Flink、Spark Streaming 和 Storm 等计算引擎对流式数据进行处理的过程。 下图展示了流式平台的整体架构。从左到右第一列橙色部分是数据源,包含两部分,即 User 和 Database。 User 指的是用户各种各样的埋点数据,如用户 APP 和 WebServer

MySql性能优化

拜拜、爱过 提交于 2020-01-17 14:11:51
` ` ` bash show variables like '%max_connections%' ; show variables like '%max_user_connections%' ; ` show variables like '%max_connections%' ; show variables like '%max_user_connections%' ; ` ` MySQL性能 最大数据量 最大并发数 查询耗时0.5秒 实施原则 数据表设计 数据类型 避免空值 text类型 索引优化 索引分类 优化原则 SQL优化 分批处理 不做列运算 避免Select * 操作符<>优化 OR优化 IN优化 LIKE优化 JOIN优化 LIMIT优化 其他数据库   博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是 没有命中索引和没有分页处理 。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。 MySQL性能 最大数据量    抛开数据量和并发数,谈性能都是耍流氓 。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 文件系统 单文件大小限制 FAT32 最大4G NTFS

MySQL存储引擎与执行计划

不问归期 提交于 2020-01-17 13:58:19
存储引擎 存储引擎是指定在表之上的,即一个库中的每一个表都可以指定专用的存储引擎 。 不管表采用什么样的存储引擎,都会在数据区,产生对应的一个frm文件(表结构定义描述文件) 。 在新版本中frm文件已经被mysql舍弃 CSV存储引擎 为其添加索引时报错 Too many keys specified; max 0 keys allowed 为其添加默认为null的列时 提示 The storage engine for the table doesn't support nullable columns 因此,CSV引擎的表不能定义索引,列定义必须是NOT NULL,不能设置自增列 CSV数据的存储是用,隔开,可直接编辑CSV文件进行数据的插入或删除;编辑之后,要生效使用flush table xxx; Create Table : CREATE TABLE ` csv_name ` ( ` name ` varchar ( 10 ) NOT NULL , ` age ` tinyint ( 4 ) NOT NULL ) ENGINE = CSV DEFAULT CHARSET = utf8mb4 COMMENT = 'csv 测试' //插入操作 insert into csv_name values ( "wojiushiwo" , 2 ) ; insert into

mysql性能优化配置总结

大憨熊 提交于 2020-01-17 06:33:39
看了一些优化mysql运维的一些书籍,在此记录总结下: 进入mysql客户端输入以下sql: 1、连接设置 show variables like '%max_connection%'; show status like '%Max_used_connections%'; Max_used_connections/max_connection <=85%,参数配置项的值可对照修改 2、存储在堆栈中的连接数量 show variables like '%back_log%'; back_log 默认为50 建议修改为 128~512 3、数据连接关闭前等待时间 show variables like '%timeout%'; 修改interactive_timeout wait_timeout 2项的值,默认为28800,建议修改为7200 4、索引缓冲区的大小 show status like '%read%'; 索引未缓存命中率 key_read/key_request_reads ~=0.001~0.01 5、查询缓冲区的大小(query_cache_size) show variables like '%cache%'; show status like '%qcache%'; 缓存碎片率 Qcache_free_blocks/Qcache_total_blocks <20%

Mysql存储过程

爱⌒轻易说出口 提交于 2020-01-17 05:28:15
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。 存储过程的优点: (1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).减少网络流量:针对同一个数据库对象的操作(如查询、修改)

MySQL性能优化学习(一)—— MySQL的执行流程

佐手、 提交于 2020-01-17 05:09:02
一、一条sql的执行过程 APP(客户端) ↓↓ 查询缓存 可以提高效率,但sql不完全一样时即失效。表内容变化时也失效。因此最好还是ORM框架去实现。 MYSQL的查询缓存默认关闭,8.0的版本以后已经去除该缓存模块。 ↓↓ 解析器 对sql进行词法解析,语法解析。判断是否正确 ↓↓ 预处理器 检查表是否存在,列是否存在 ↓↓ 查询优化器 执行前对sql进行优化,生成执行计划 查询优化器追踪: ↓↓ 查询执行引擎 由其获得执行计划去操作存储引擎 ↓↓ 存储引擎 数据存放在什么结构里,由存储引擎决定。 每个表都可以有不同的存储引擎。 查看表的存储引擎: show table status from `tablename`; 执行流程整体图: 二、存储引擎 5.5版本以前默认MyISAM,之后默认InnoDB MyISAM只支持表级别的锁,插入和查询的操作效率高,不支持事物,不支持外键。 InnoDB支持事物和外键,支持行锁,因此数据完整性较高。数据一致性要求高,比较多更新操作适用, Memory数据存放在内存中,读写数据快,如果需要临时存储数据适用。 CSV表体积较小,适用于迁移,不支持索引。 InnoDB的结构 BufferPoor:写入磁盘前先走BP,提升读写效率 RedoLog:先写日志,再把数据从内存同步到磁盘中 仅在InnoDB中实现,可用于崩溃恢复 UndoLog

mybatis介绍

浪子不回头ぞ 提交于 2020-01-17 04:28:58
mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 以前叫ibatis,现在的mybatis就第三版。 jdbc:编写sql–>预编译–>设置参数–>执行sql–>封装结果 (目的完成JavaBean与DBRecords数据表的映射) 1.功能简单;sql语句编写在Java代码里面;硬编码高耦合,维护不易。 hebernate:将jdbc过程黑箱操作,上述五步全都不要开发人员做;全自动全映射ORM框架,旨在消除sql。但是框架固定的sql不一定适用;这时候就要定制sql语句需要用上HQL。内部产生的sql不易优化,长难复杂sql处理不易,全映射导致数据库性能下降。 希望:sql语句交给开发人员编写;sql不失去灵活性。 mybatis:半自动持久层框架(把关键步骤留给开发人员),轻量级框架;将sql写入配置文件,其他流程还是自动,sql与Java分离;sql是开发人员控制。解耦。 mybatis下载: https://github.com/mybatis

Mybatis原理分析之一:从JDBC到Mybatis

给你一囗甜甜゛ 提交于 2020-01-16 23:15:47
1.引言 本文主要讲解JDBC怎么演变到Mybatis的渐变过程,重点讲解了为什么要将JDBC封装成Mybaits这样一个持久层框架。再而论述Mybatis作为一个数据持久层框架本身有待改进之处。 2.JDBC实现查询分析 我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据,一般需要以下七个步骤: (1) 加载JDBC驱动 (2) 建立并获取数据库连接 (3) 创建 JDBC Statements 对象 (4) 设置SQL语句的传入参数 (5) 执行SQL语句并获得查询结果 (6) 对查询结果进行转换处理并将处理结果返回 (7) 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet) 以下是具体的实现代码: Java代码 public static List<Map<String,Object>> queryForList(){ Connection connection = null ; ResultSet rs = null ; PreparedStatement stmt = null ; List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>(); try { //加载JDBC驱动 Class.forName( "oracle.jdbc

SQL之Join的使用

点点圈 提交于 2020-01-16 21:04:36
一.基本概念 关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 –建表user1,user2: table1 : create table user2(id int, user_name varchar(10), over varchar(10)); insert into user1 values(1, ‘tangseng’, ‘dtgdf’); insert into user1 values(2, ‘sunwukong’, ‘dzsf’); insert into user1 values(1, ‘zhubajie’, ‘jtsz’); insert into user1 values(1, ‘shaseng’, ‘jslh’); table2 : create table user2(id int, user_name varchar(10), over varchar(10)); insert into user2 values(1, ‘sunwukong’, ‘chengfo’); insert into user2 values(2, ‘niumowang’, ‘chengyao’); insert into user2 values(3, ‘jiaomowang’, ‘chengyao’); insert