MySQL 基础技能与原理 —— 基础技能 MySQL DBA Team 彭立勋( )

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

作業一 : USING DBMS ( 使用 DB2 及 SQL 基本練習 ) 報告人:學生楊群期 學號: 課程 : 高等資料庫 講師 : 楊維邦教授.
1 第 5 章 SQL 语句基础 在 Oracle 数据库中,为了方便管理用户所创建的 数据库对象,引入了模式的概念,这样用户所创建的 数据库对象就都属于该用户模式。对于一般的用户而 言,数据库中的数据是以表、视图行等方式存储的( 表和视图就是最基本的用户模式对象),用户只需要 根据自己的需求查询数据库,然后由数据库根据请求.
Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
PHP 训练营 - MySQL OA 产品部 李鑫辉 2011 年 9 月. 内容提要 & 目录 1. 介绍 (10 分钟 ) 1.1. 简介 1.2. 特点 1.3. 安装 2. 语法 (60 分钟 ) 2.1. 存储引擎 MyISAM InnoDB 特点与区别.
Java 技术与应用 数据库应用 ( 第 14 章 ) 西安交大 卫颜俊 2008 年 12 月 电子信箱: QQ: 网站 : /java.
SQL 入门 SQL:Structured query language 北京传智播客教育.
第八单元 数据库MySQL应用基础 MySQL数据库应用基础 MySQ数据库操作使用 Mysql管理工具 第25章 数据库的增加/删除操作
第5章 关系数据库标准语言SQL 主讲:张丽芳.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
数据库技术 实践.
第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
OceanBase 0.4:从API到SQL 日照
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
資料庫 (Database) SQL Server 2008實作
第3章 SQL的基础知识 数据库管理及应用 3.1 SQL简介 3.2 SQL的数据模型 3.3 标识符 3.4 使用SQL语句管理数据库
导 师: 张 伟 答辩人: 王 雄 专 业: 计算机科学与技术
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
数据库原理及设计 --作业.
第4讲 MySQL服务器的配置与应用.
文科计算机小公共课规划教材 Access 程序设计.
创建数据库 MySql创建数据库的语法: CREATE DATABASE 数据库名; 例: CREATE DATABASE mydb;
第三章 管理信息系统的技术基础 主要内容: 数据处理 数据组织 数据库技术 4. 计算机网络.
计算机应用基础 上海大学计算中心.
Oracle数据库入门.
第六章 學習SQL語言.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
課程名稱:資料庫系統 授課老師:李春雄 博士
PHP與MySQL 入門學習指南 凱文瑞克 著 第 23 章 資料型別.
第十一章 資料庫設計與權限設定.
数据库技术 第三章 关系数据库标准语言SQL 中国科学技术大学网络学院 阚卫华.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
Chap 10 SQL定義、操作與控制指令.
第 11 章 建立檢視表.
第 7 章 建立資料表與 資料庫圖表.
資料庫安全 (Database Security)
教 师:曾晓东 电 话: 数据库技术 教 师:曾晓东 电 话:
SQL Server 2000 数据库入门.
第3章 MySQL教學範本 主從式資料庫系統 - CH3.
MySQL数据库基础与实例教程 之 MySQL表结构的管理 郭水泉.
浅谈MySql索引及锁的应用 厦门大学数据库实验室 刘颖杰 2014年3月8日.
第三章:包   包(package)是一个可以将相关对象存储在一起的PL/SQL结构。包包含了两个分离的部件------包说明(specification)和包主体(body)。每个部件都单独被存储在数据字典中。包只能存储在数据库中,不能是本地的。除了可以将相关对象作为一组存在一起以外,包也是十分有用的,因为它们在依赖性方面的限制是比较小的。也有许多性能上的优点。
第九章 進階的查詢技巧.
第三章作业讲评 文洁 2012/4/10.
SQL SERVER 一些经典语句 1.
实验4:PL-SQL编程 1.实验目的 2.实验原理 PL/SQL是一种过程化语言,属于第三代语言,本实验在与熟悉使用PL/SQL编程.
MySQL 結構化查詢語言 MySQL.
第十二章 SQL語言簡介 講授大綱: 新增資料庫 新增資料表 新增資料 修改資料 刪除資料 查詢資料 透視ASP.NET-第12章
iRepor报表设计基础 IReport安装 普通实体报表 数据结果集报表 工作流主从报表 饼状图报表 柱状图,曲线图报表 条形码报表
数据库应用技术 SQL Server 2005.
第 10 章 数据库编程.
第20章 MySQL数据库.
数据库技术与应用.
ORACLE 第九讲 触发器.
MySQL开发规范 DB组-张浩.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
CS, ZJU 4/18/2019 Chapter 7 数据库.
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
第 15 章 自訂函數與順序物件.
学习目标 1、什么是表连接 2、表连接类型 3、表连接区别.
查询与视图 蔡海洋.
SQL查询语句 蔡海洋.
用int类型(4字节)去存具体时间(8字节).
OceanBase 0.4:从API到SQL 日照
第三章 SQL Server数据管理.
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
MySQL执行计划解读 胡中泉.
第4章 数据查询.
Presentation transcript:

MySQL 基础技能与原理 —— 基础技能 MySQL DBA Team 彭立勋( )

内容概要 1. MySQL 开发流程规范 2. MySQL 数据类型与处理函数 3. MySQL 高级特性 4. MySQL 与 Oracle 差异比较 5. MySQL 调优基础

MySQL 开发流程规范 线上文档: B2B-OPS B2B-OPS 命名规范:数据库 / 表 / 字段命名 对象设计规范:数据类型,表设计,约束使用 SQL 编写规范:绑定变量与替代变量,数据类型转换,表连接,分页查询等

MySQL 数据类型与处理函数 数值类型与处理函数 字符类型与处理函数 时间类型与处理函数 类型处理小技巧 官方文档:

数值类型与处理函数 BIT(M): 位字段类型。 M 表示每个值的位数,范围为从 1 到 64 。 M 默认为 1 。 TinyINT(M): 带符号的范围是 到 。 无符号的范围是 0 到 。 1 字节。 SmallINT(M): 带符号的范围是 到 。 无符号的范围是 0 到 。 2 字节。 MediumINT(M): 带符号的范围是 到 。 无符号的范围是 0 到 。 3 字节。 INT(M): 带符号的范围是 到 。 无符号的范围是 0 到 。 4 字节。 BigINT(n): 带符号的范围是 到 。 无符号的范围是 0 到 。 8 字节。 Decimal(m,n): M 是总位数, D 是小数点 ( 标度 ) 后面的位数。实际上是 VARCHAR 存储。

数值类型与处理函数 算数符运算: SELECT expr; 数学函数: ABS(x) , x 的绝对值。 CEIL(x) ,返回不小于 X 的最小整数值。 FLOOR(x) ,返回不大于 X 的最大整数值 CRC32(x) ,计算循环冗余码校验值。 RAND() ,返回 0~1 直接随机浮点数。 SIGN(x) ,返回 x 的符号 TRUNCATE(X,D) ,返回 X 被舍去至小数点后 D 位的数字。

字符类型与处理函数 Char(M): 长度固定为创建表时声明的长度 M 。长度可以为从 0 到 255 的任何值。 当保存 CHAR 值时,在它的右边填充空格以达到指定的长度。 当检索到 CHAR 值时,尾部的空格被删除。 在存储或检索过程中不进行大小写转换。 占用空间 (M* 每字符字节长度 ) , UTF8 为 3 字节。 VarChar(M): 列中的值为可变长字符串。长度可以指定为 0 到 65,535 之间的值。 VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。 整体最大长度是 65,532 字节。 VARCHAR 值保存时不进行填充。 当值保存和检索时尾部的空格仍保留,符合标准 SQL 。 占用空间 ( M* 每字符字节长度 + 长度记录位 ) 。

字符类型与处理函数 CHAR_LENGTH(str) :返回值为字符串 str 的长度,长度的单位为字符。 LENGTH(str) :返回值为字符串 str 的长度,单位为字节。 CONCAT(str1,str2,...) :返回结果为连接参数产生的字符串。 CONCAT_WS(separator,str1,str2,...) :第一个参数是其它参数的分隔符。 分隔符的位置放在要连接的两个字符串之间。 LEFT(str,len) :返回从字符串 str 开始的 len 最左字符。 RIGHT(str,len) ;从字符串 str 开始,返回最右 len 字符。 SUBSTRING(str,pos,len) :从字符串 str 返回一个长度同 len 字符相同的子字符串, 起始于位置 pos 。 LOWER(str) :返回字符串 str 变为小写字母的字符。 UPPER(str) :返回字符串 str 转化为大写字母的字符。

日期类型与处理函数 TIMESTAMP :以 'YYYY-MM-DD HH:MM:SS' 格式检索和显示 TIMESTAMP 值。 支持的范围为 ‘ :00:00’ 到 2037 年。 占用 4 字节 DATETIME :以 'YYYY-MM-DD HH:MM:SS' 格式检索和显示 DATETIME 值。 支持的范围为 ' :00:00' 到 ' :59:59' 。 占用 8 字节。 DATE :用 'YYYY-MM-DD' 格式检索和显示 DATE 值。 支持的范围是 ' ' 到 ' ' 。 占用 4 字节。

日期类型与处理函数 DATE_SUB/DATE_ADD :对时间进行加减。 CURDATE() :将当前日期按照 ‘YYYY-MM-DD’ 或 YYYYMMDD 格式的值返回。 NOW() :返回当前日期和时间值, 其格式为 ‘YYYY-MM-DD HH:MM:SS’ 或 YYYYMMDDHHMMSS 。 组合使用: mysql> SELECT DATE_ADD(' ', INTERVAL 31 DAY); -> ' '

类型处理小技巧 IP 存储: INET_ATON(expr) ,将 IP 转换为整数。 INET_NTOA(expr) ,将整数转换为 IP 。 mysql> SELECT INET_ATON(' '); -> mysql> SELECT INET_NTOA( ); -> ' ‘ 判断 IP 段: INET_ATON(' ') <= IP AND IP <= INET_ATON(' '); VARCHAR 存储: (3*4+3)+1=16 位, UTF8 字符集 15*3+1=46 字节 INT 存储: 4 字节

MySQL 高级特性 存储过程基础 触发器基础 分区表基础 应用场景

存储过程基础 官方文档: 变量定义顺序必须是:存储函数变量  游标定义  游标异常  程序主体 定义务必加上授权: CREATE PROCEDURE sp(); 存储过程相关权限:被操作表的相关权限及 EXECUTE( 执行权限 ) , ALTER ROUTINE( 修改权限 ) , CREATE ROUTINE( 创建权限 ) 。 存储过程 / 删除内不能调用存储过程,但可以调用函数。 不能使用动态游标, CURSOR 中不能有动态的表名。 查看创建存储过程 / 函数的语句: SHOW CREATE PROCEDURE/FUNCTION ps; 查看所有存储过程 / 函数: SHOW PROCEDURE/FUNCTION STATUS [LIKE ps]; 调用存储过程: CALL sp(); 调用存储函数: SELECT sp();

触发器基础 官方文档: 定义务必加上授权: CREATE Trigger tgr(); 定义语句: CREATE Trigger tgr() AFTER/BEFORE INSERT/UPDATE/DELETE ON table FOR EACH ROW; 数据调用: NEW.* (更新后数据) OLD.* (更新前数据) 行级触发器,每一行都会触发动作 内部可以调用存储过程和函数 每种类型的 Trigger 在一张表上只能建立一个

分区表基础 官方文档: 分区类型: RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。 LIST 分区:类似于按 RANGE 分区,区别在于 LIST 分区是基于列值匹配一个 离散值集合中的某个值来进行选择。 HASH 分区:基于用户定义的表达式的返回值来进行选择的分区,该表达 式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含 MySQL 中有效的、产生非负整数值的任何表达式。 KEY 分区:类似于按 HASH 分区,区别在于 KEY 分区只支持计算一列或多列, 且 MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 子分区:子分区是分区表中每个分区的再次分割。

分区表基础 —Range 分区 每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些 区间要连续且不能相互重叠,使用 VALUES LESS THAN 操作符来进行定义。 CREATE TABLE employees ( id INT NOT NULL, store_id INT NOT NULL ) PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (6), //1~5 PARTITION p1 VALUES LESS THAN (11), //6~10 PARTITION p2 VALUES LESS THAN (16), //11~15 PARTITION p3 VALUES LESS THAN MAXVALUE // 16~MAX ) ;

分区表基础 —List 分区 LIST 分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中 的一个值。 LIST 分区通过 ”VALUES IN (value_list)” 的方式来定义每个分区, 其中 ”value_list” 是一个通过逗号分隔的整数列表。 CREATE TABLE employees ( id INT NOT NULL, store_id INT ) PARTITION BY LIST(store_id) PARTITION p1 VALUES IN (3,5,6,9,17), PARTITION p2 VALUES IN (1,2,10,11,19,20), PARTITION p3 VALUES IN (4,12,13,14,18), PARTITION p4 VALUES IN (7,8,15,16) ) ;

分区表基础 —Hash 分区 在 HASH 分区中, MySQL 自动完成分区值,你所要做的只是基于将要被哈希 的列值指定一个列值或表达式,以及指定被分区的表将要被分割成的分区 数量。 CREATE TABLE employees ( id INT NOT NULL, store_id INT ) PARTITION BY HASH(store_id) PARTITIONS 4 ;

分区表基础 — 子分区 子分区是分区表中每个分区的再次分割,子分区既可以使用 HASH 希分区, 也可以使用 KEY 分区,每个分区必须有相同数量的子分区。 CREATE TABLE ts (id INT, purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH(TO_DAYS(purchased)) ( PARTITION p0 VALUES LESS THAN (1990) ( SUBPARTITION s0, SUBPARTITION s1 ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2, SUBPARTITION s3 ));

高级特性应用场景 存储过程不得包含业务逻辑,一般只做临时数据订正或固定逻辑用。 触发器目前只用于 Otter ,一般不使用。 分区表适合数据量大,但查询会固定在若干个数据集中的场景,但不要把 分区表混合排序使用,可能带来严重的性能故障。( BRMMS 发生过)

MySQL 与 Oracle 差异比较 优化器差异 SQL 方言差异 常用功能差异

优化器差异 MySQL 对子查询会处理为临时表,所以一般 JOIN 效率比做子查询高。 MySQL 在 JOIN 中对 ORDER BY 、 GROUP BY 优化较弱, JOIN 中的排序分组几乎都会 使用 Fille Sort 和临时表 MySQL 只有 RBO ,没有 CBO ,所以总是选择类型上最优的执行计划,而不一定是 开销最小的。 MySQL 对于 OR ,很多时候并不会优化成两次索引访问或合并索引,所以 OR 最好 写成两条 SQL ,做 UNION ALL 。 IN 中存在 NULL 条件,可能会让优化器走成全表扫描。

SQL 方言差异 选择部分行: Oracle 使用 Rownum , MySQL 使用 LIMIT start,end; 执行函数: Oracle 需要 SELECT f() FROM dual; MySQL 可以直接 SELECT f(); 复制数据: Oracle 必须有 as , CREATE TABLE t AS SELECT * FROM table; MySQL 的 as 是可选, CREATE TABLE t SELECT * FROM table;

常用功能差异 锁差异: Oracle 锁加在数据块上, InnoDB 锁加在主键索因上,所以 InnoDB 总是 有主键索引。 导入导出数据: Oracle 采用 EXP/IMP 导入导出。 MySQL 采用 mysqldump 导出,导入可以采用管道或 source 。 mysqldump –u 用户 –p 密码 DB [table1 table2…] > db.sql 提交方式: MySQL 默认自动提交, Oracle 默认手动提交, MySQL 大批量操作最 好改变为手动提交, SET AUTOCOMMIT=0 SQL 缓存: MySQL 只能缓存结果集,不能缓存 SQL 解析结果 数据库对象: Oracle 将数据库对象编译存储,直接执行二进制码, MySQL 只存 储代码,临时解析执行,所以 MySQL 触发器、存储过程等对象创建时仅检查语 法,并不检查逻辑

MySQL 调优基础 索引优化基础 Schema 设计优化 SQL 书写优化

索引优化基础 MySQL 只在认为走索引可以筛去 85% 以上数据的时候,才使用索引,如果达 不到这个标准,索引是无意义的。 前缀索引: MySQL 可以利用索引的前向部分,但不可以利用后向部分,不支 持反向索引。 例如: SELECT col2 FROM table WHERE col1=1; 可以使用索引 (col1,col2) ,但不 可以使用 (col2,col1). 不等比较的优化:如果索引的前向部分在 WHERE 中是等于,那么可以使用索 引,如果索引的前向部分再 WHERE 中是不等比较,那么不可以为后面的等于 比较使用索引 例如: SELECT col1 FROM table WHERE col2=1 AND col3 >10; 可以完全使用索 引 (col2,col3) ,但只可以使用 (col3,col2) 的前缀, 排序的优化:可以在条件是等于的时候继续使用索引排序,或者条件中的不 等于字段就是排序字段。 例如: SELECT col1 FROM table WHERE col2=1 AND col3>0 ORDER BY col3 ,可 以完全使用索引 (col2,col3) 避免排序。但条件是 col2<1 AND col3=0 ORDER BY col3 时则只能使用 col2 排除记录,不可以用来排序。 GROUP BY/DISTINCT 也是以排序为基础,优化同上。

Schema 设计优化 TEXT/BLOB 字段分开单表存储与原表主键一一对应。 经常查询的字段与不经常查询的字段分开存储,用主键一一对应,例如帖子 标题和内容。 频繁进行统计的 SQL ,可以转化为表存储,将查询压力分散到更新时。 频繁的对表进行 count 也可以转化为统计表存储,《计数表的技巧》。计数表的技巧

SQL 书写优化 尽量将子查询转化为链接查询,除非子查询只返回极少的记录。 不要在条件里写不必要的条件。 没有必要排序的分组采用 ORDER BY null 指定不排序。 OR 条件若不能正确的走索引,则拆分为两条 SQL 。 不在乎重复的情况下, UNION ALL 可以避免 UNION 要做的排序。 没必要的时候不要做外连接,内连接效率比外连接高。