sql优化

Spark SQL编程指南

本秂侑毒 提交于 2020-01-20 03:19:54
Spark SQL 编程指南 Spark SQL是用于结构化数据处理的一个模块。同Spark RDD 不同地方在于Spark SQL的API可以给Spark计算引擎提供更多地 信息,例如:数据结构、计算算子等。在内部Spark可以通过这些信息有针对对任务做优化和调整。这里有几种方式和Spark SQL进行交互,例如Dataset API和SQL等,这两种API可以混合使用。Spark SQL的一个用途是执行SQL查询。 Spark SQL还可用于从现有Hive安装中读取数据。从其他编程语言中运行SQL时,结果将作为Dataset/DataFrame返回,使用命令 行或JDBC / ODBC与SQL接口进行交互。 Dataset是一个分布式数据集合在Spark 1.6提供一个新的接口,Dataset提供RDD的优势(强类型,使用强大的lambda函 数)以及具备了Spark SQL执行引擎的优点。Dataset可以通过JVM对象构建,然后可以使用转换函数等(例如:map、flatMap、filter等),目前Dataset API支持Scala和Java 目前Python对Dataset支持还不算完备。 DataFrame是命名列的数据集,他在概念是等价于关系型数据库。DataFrames可以从很多地方构建,比如说结构化数据文 件、hive中的表或者外部数据库,使用Dataset

漫谈MySQL体系结构[转]

落爺英雄遲暮 提交于 2020-01-20 01:47:38
背景 了解MySQL的架构图,对MySQL有一个整体的把握,对于以后深入理解MySQL是有很大帮助的。比如:很多查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行。 MySQL从概念上分为四层,如下图: 这四层自顶向下分别是 网络连接层,服务层(核心层),存储引擎层,系统文件层 。 我们自顶向下开始讲解。 网络接入层 作用 主要负责 连接管理、授权认证、安全 等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是MySQL所特有的技术。 为什么要设计成线程池? 在服务器内部,每个client都要有自己的线程。这个连接的查询都在一个单独的线程中执行。想象现实场景中数据库访问连接实在是太多了,如果每次连接都要创建一个线程,同时还要负责该线程的销毁。对于系统来说是多么大的消耗。由于线程是操作系统宝贵的资源。这时候线程池的出现就显得自然了,服务器缓存了线程,因此不需要为每个Client连接创建和销毁线程。 服务层 作用 第二层服务层是MySQL的核心,MySQL的核心服务层都在这一层, 查询解析,SQL执行计划分析

MySQL存储过程详解(转)

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

分库分表理论篇—— 以MySQL为例

时光总嘲笑我的痴心妄想 提交于 2020-01-20 00:27:06
分库分表理论篇—— 以MySQL为例 文章目录 分库分表理论篇—— 以MySQL为例 一、背景 二、如何优化 三、什么是分库分表 三、优势和弊端 一、背景 当今互联网大爆炸的时代, 业务 越来越多和大, 单库单表 数据超出数据库支持 容量 ,数据库 I/O操作 次数会越来越多和慢,数据库的整体 性能 就会急剧下降。 二、如何优化 这里我想到几种优化的方法 减少数据库访问压力 使用 缓存 技术,对数据库的信息进行缓存,减少数据库访问压力 使用 Nginx 进行静态资源的获取,对一些高访问的 网页 ,一次访问时可以先生成 静态页面 存到 本地 中,用户再次访问就会直接返回,这样减少与数据库的交互和渲染页面的操作,提高效率 读写分离 互联网业务一般 读多写少 , 读写 比例基本是 10:1 。比如订单业务,顾客购买商品生成 一次 订单后,就会 多次 查看订单情况。这时可以采用 主从架构 , 主库 负责 DML (增删改)操作, 从库 负责 DQL (查看操作), 一 个主库可以有 多 个从库,极大减轻读写压力 提升数据库性能 可以从机器性能入手,内存不够加内存条,外存( 如硬盘 )不够加外存,这样即使数据量在大,也不会影响I/O读写速率, 但是 ,数据量大会增加 I/O的次数 ,数据库性能依旧会下降,不推荐,成本太高,没钱花,/(ㄒoㄒ)/~~ 优化数据库 索引 ,数据库 语句

提高SQL查询效率的30种方法

爷,独闯天下 提交于 2020-01-19 23:34:43
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 5.in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3 6.下面的查询也将导致全表扫描: select

SQL解析Json字段

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-19 22:59:01
MySQL支持原生JSON类型,使用JSON数据类型相较于将JSON格式的字符串存储在String型中的优势有: 存储时会自动验证JSON文本; 可以优化存储格式。存储在JSON型中的JSON文本会被转换成一个支持快速读取的文档元素,这样在使用时不需要再解析文本,并且可以直接通过键和索引访问其中的子对象而无需读取全部文本。 JSON型中可存储的JSON文本的大小不会超过mysql.ini配置文件中设置的max_allowed_packet的值。 JSON_EXTRACT()函数用于从JSON中提取元素,例如: 列名:info { "Info1" : [ [ { "id" : 1 , "name" : "aaa" , "grade" : [ "{\"china\":100,\"engine\":[\"95\"],\"match\":[\"99\"]}" ] } ] ] } select json_extract ( info , '$.Info1' ) from table1 ; 查询结果: [ [ { "id" : 1 , "name" : "aaa" , "grade" : [ "{\"china\":100,\"engine\":[\"95\"],\"match\":[\"99\"]}" ] } ] ] select json_extract ( info , '$.Info1

mysql基础篇-引擎区别

孤人 提交于 2020-01-19 19:33:00
引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义。例如创建一个名为 MyTable的表,MySQL会在MyTable.frm文件中保存该表的定义。 因为MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。在Windows中,大小写是不敏感的;而在类Unix中则是敏感的。不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在MySQL服务层统一处理的。 查看引擎 show engines; Engine Support Comment Transactions XA Save point InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES MRG_MYISAM YES Collection of identical MyISAM tables NO

MyBatis的HelloWord和接口式编程

痴心易碎 提交于 2020-01-19 17:39:06
MyBatis的HelloWord和接口式编程 为什么要使用MyBatis? mybatis是一个半自动化的持久层框架 JDBC SQL夹在java代码块里,耦合度高导致硬编码内伤。 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。 Hibernate和JPA 长难复杂sql,对于hibernate而言处理也不容易。 内部自动化生产的sql,不容易做特殊化。 基于全映射的全自动化自动框架,大量字段的pojo进行映射时比较困难, 导致数据库性能下降。 对于开发人员而言,核心sql还是需要自己优化 sql和java编码分开,功能边界清晰,一个专注业务,一个专注数据。 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type

Django自带mysql orm操作插入外键的正确打开方式

会有一股神秘感。 提交于 2020-01-19 16:50:57
在给网站数据库优化的过程中,需要给几张表增加外键限制,方便管理员界面的联表操作。 调研发现,网上提供的几种models的配置都不能让我的插入程序成功运行,在经过尝试之后总结出了一个终极解决方案。 我的环境:Django==2.1.7,Python==3.6.1 我建表一般先过Navicat这种可视化软件来生成mysql数据库,所以我们直接在建表之后使用下面语句直接生成。 python manage.py inspectdb > app/models.py // 'app' 是我项目名称 生成的models.py部分代码: class InfoUpload(models.Model): # 子表 upload_id = models.AutoField(primary_key=True) contact_email = models.ForeignKey('InfoUser', model.DO_NOTHING, db_column='contact_email') class Meta: managed = False db_table = 'info_upload' class InfoUser(models.Model): # 主表 user_id = models.AutoField(primary_key=True) contact_email = models

MySQL数据库之综述

旧街凉风 提交于 2020-01-19 10:12:52
内容简介:本篇文章旨在较全面介绍MySQL数据库,数据来源维基百科 一、MySQL数据库概述 MySQL原本是一个开放源码的关系数据库管理系统,原开发者为瑞典的MySQL AB公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。 MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如中文维基百科、Google和Facebook等网站。非常流行的开源软件组合LAMP中的“M”指的就是MySQL。 但被甲骨文公司收购后,Oracle大幅调涨MySQL商业版的售价,且甲骨文公司不再支持另一个自由软件项目OpenSolaris的发展,因此导致自由软件社群们对于Oracle是否还会持续支持MySQL社群版(MySQL之中唯一的免费版本)有所隐忧,MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB。而原先一些使用MySQL的开源软件逐渐转向MariaDB或其它的数据库。例如中文维基百科已于2013年正式宣布将从MySQL迁移到MariaDB数据库。 二、MySQL数据库历史 2008年1月16日,Sun