MySQL的基础、开发、优化

不打扰是莪最后的温柔 提交于 2020-08-10 09:39:16

数据库MySQL的基础、开发、优化笔记

一、基础

1.SQL基础

DDL: data definition language (数据定义语言)

-- 数据库的基本操作
create database test1;
show databases;
use test1;
drop database test1;
-- 数据表的基本操作
show tables;
create table tablename(col_name1 col_type_contraints
                      col_name2 col_type_contraints)
-- 得到数据表的详细信息
desc tablename;
show create table tablename \G;
-- 修改表
alter table tablename modify col_name1 new_col_type_contraints;
alter table tablename rename new_tablename;

DML: data manipulation language (数据操纵语句)

  • 插入insert、更新update、删除delete、查询select

CRUD(create,retrive,update,delete)

-- 插入记录
insert into tablename(field1,field2,field3) values(value1,value2,value3);
insert into tablename(field1,field2,field3) values(value1,value2,value3),(val1,val2,val3);
-- 更新记录
update tablename set filed1=value1,field2=value2 [where condition];
-- 删除记录
delete from tablename where condition;
delete from tablename where filed1='value1';
-- 查询
select * from tablename [where condition];
-- distinct关键字保证记录不重复
select distinct field from tablename;
-- 条件查询 where condition
-- 排序限制 order by、desc、asc
-- 显示限制 limit offset count;
  • 聚合 aggregation
  • 表连接: 左连接 left join、右链接 right join
  • 记录联合 union

DCL: data control language (数据控制语句)

  • 管理系统中的对象权限时使用

查找操作语法,函数

  • 操作语法
  • 字段类型的取值范围
  • 版本支持函数
  • 函数功能
? contents

mysql> help contents
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
   Account Management
   Administration
   Components
   Compound Statements
   Contents
   Data Definition
   Data Manipulation
   Data Types
   Functions
   Geographic Features
   Help Metadata
   Language Structure
   Plugins
   Storage Engines
   Table Maintenance
   Transactions
   User-Defined Functions
   Utility
   
   
? data types

mysql> ? data types
You asked for help about help category: "Data Types"
For more information, type 'help <item>', where <item> is one of the following
topics:
   AUTO_INCREMENT
   BIGINT
   BINARY
   BIT
   BLOB
   BLOB DATA TYPE
   BOOLEAN
   CHAR
   CHAR BYTE
   DATE
  

2.MySQL数据类型

2.1数值类型

  • 整数类型
TINYINT      --字节数  1
SMALLINT     --字节数  2
MEDIUMINT    --字节数  3
INT INTEGER  --字节数  4
BIGINT       --字节数  8
  • 浮点数类型
FLOAT        --字节数  4
DOUBLE       --字节数  4
  • 定点数类型
DEC(M,D)      --字节数M+2
DECIMAL(M,D) 
  • 位类型
BIT(M)        --字节 1~8

2.2日期时间类型

  • 时间和日期
DATE         -- 字节 4   年月日
DATETIME     -- 字节 8   年月日时分秒
TIMESTAMP    -- 字节 4   时间戳?
TIME         -- 字节 3   时分秒
YEAR         -- 字节 1   年

2.3字符串类型

字符数据的存储类型

CHAR 
VARCHAR
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
VARBINARY
BINARY

3.MySQL中运算符

运算符用来连接表达式的项

3.1算术运算符

  • /
  • %

3.2比较运算符

=
!=
BETWEEN          -- 存在指定范围
IN
IS NULL
IS NOT NULL
LIKE
REGEXP RLIKE     -- 正则表达式匹配

3.3 逻辑运算符

逻辑运算符也称为布尔运算符

NOTAND &&
OR ||
XOR 

位运算符

&   与
|  或
^   异或
~  取反
>>  右移
<<  左移

4.常用函数

4.1字符串函数

CONCAT(S1,S2)
INSERT(str,x,y,instr)
LOWER(str)
UPPER()
LEFT()
RIGHT()
LPAD(str,n,pad)  --用字符串pad对str最左边进行填充,直到长度为n的字符长度
RPAD(str,n,pad) 
LTRIM(str)       --去掉字符串str左侧的空格
RTRIM(str)       --去掉字符串str右侧的空格
REPEAT(str,x)
REPLACE(str,a,b) --字符串b替换字符串str所有出现的字符串a
STRCMP(s1,s2)
TRIM(str)        --去掉字符串行尾和行头的空格
SUBSTRING(str,x,y)      --返回从字符串str x位置起y个字符长度的字串

4.2数值函数

ABS(X)
CEIL(X)     -- 返回大于x的最小正整数
FLOOR(X)    -- 返回小于x的最大整数值
MOD(X)
RAND()
ROUND(X,Y)
TRUNCATE(X,Y)    --返回数字x截断为y位小数的结果

4.3流程函数

IF(value,t f)
IFNULL(value1,value2)
CASE WHEN[VALUE] THEN[result] ..ELSE[default] END
CASE[expr] WHEN [value] THEN[result] 

4.4常用函数

DATABASE()    -- 数据库名
VERSION()     -- 数据库版本
USER()        -- 当前登录的用户名
INET_ATON(ip)  -- 将ip地址转换为数字表示
INET_NTOA(num) -- 返回数字代表的ip地址
PASSWORD(str)  -- 返回字符串str的加密版本
MD5(str)       -- 返回字符串str的md5值

二、开发

1.表类型(存储引擎)的选择

针对不同存储需求可以选择最优的存储引擎

  • MyISAM
  • InnoDB 事务安全表
engine support comment transactions xa savepoints
MyISAM YES MyISAM storage engine NO NO NO
InnoDB YES YES YES YES

1.1 InnoDB存储引擎

InnoDB是默认事务型存储引擎

默认的级别是 可重复读,在可重复读隔离的级别下采用多版本并发控制MVCC间隙锁Next-Key Locking 来防止幻影读。

还支持真正的在线热备份,索引自增长列(auto_increment)

-- 可以在创建表的时候为主键  添加AUTO_INCREMENT
-- 也可以通过修改表来实现
ALTER TABLE *** AUTO_INCREMENT=n;

提供了真正的提交、回滚和崩溃恢复能力的事务安全

1.2 MyISAM存储引擎

设计简单,对于数据量小、只读的数据表可以使用

不支持事务,不支持行级锁,只能对整张表加锁(共享锁、排它锁)

支持压缩表空间数据索引

create table tablename(
  i bigint(20) not null auto_increment,
  primary key (i)
)engine=MyISAM DEFAULT CHARSET=gbk;

alter table tablename engine=innodb;  -- 可以实现存储引擎的修改

2.数据类型选择

2.1 CHAR、VARCHAR

char是定长字符类型,varchar是可变长度字符类型

通常情况下建议使用varchar,使用varchar来最小化需要处理的数据行的存储总量和磁盘I/0是比较好的。

2.2 TEXT、BLOB

text和blob用来保存比较大的文本

text只能保存字符数据,bolb可以保存二进制数据、例如照片

2.3 浮点数和定点数

浮点数一般用于表示含有小数部分的数值

定点数可以更精确的保存数据(实际上以字符串形式存放)

Java中使用BigDecimal类实现定点数的精确计算

3.字符集

字符集就是一套文字符号及其编码、比较规则的集合

uft-8

4.索引的设计和使用

索引是数据库用来提高性能的最常用工具,可以快速找出某个列中有一特定值的行

存储引擎的表默认都是BTREE索引

三、优化

sql语句成为整个系统性能的瓶颈,对他们进行优化

使用sakila模版数据库来实现优化 sakila下载地址

  • sakila-schema.sql 数据库中表的创建
  • sakila-data.sql 数据灌入
  • sakila.mwb mysql的workbench数据模型

1.优化sql的一般步骤

  • 1.show status了解各种sql的执行效率
show status like 'Com_%'
-- Com_select,执行 增删改查 操作的次数
-- Com_insert
-- Com_update
-- Com_delete
-- Com_commit,了解事物提交和回滚的情况
-- Com_rollback
-- Connections,连接mysql服务器的次数
-- Uptime,服务器工作时间
  • 2.定位执行效率低的sql语句
-- Slow_queries,慢查询的次数
通过查询日志定位那些执行效率较低的SQL语句
show processlist  -- 查看当前正在执行的线程
  • 3.EXPLAIN分析低效SQL的执行计划
select_type,有simple表、primary主查询、union、subquery等
访问类型type
type: ALL,INDEX,RANGE,ref,eq_ref,const/system,null
type类型向右效率不断提高

  • 4.show profile 分析SQL
-- 查看当前MySQL是否支持profile
select @@have_profiling;
select @@profiling;

-- 默认profiling是关闭的
set profiling=1-- 可以进行开启

mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select count(*) from payment;
+----------+
| count(*) |
+----------+
|    16049 |
+----------+
1 row in set (0.01 sec)

mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 | 0.00443500 | select count(*) from payment |
+----------+------------+------------------------------+
1 row in set, 1 warning (0.00 sec)

show profile for query_id;
-- 能够看到执行过程中线程的每个状态和消耗时间
mysql> show profile for query 1;
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000112 |
| Executing hook on transaction  | 0.000020 |
| starting                       | 0.000010 |
| checking permissions           | 0.000029 |
| Opening tables                 | 0.000062 |
| init                           | 0.000016 |
| System lock                    | 0.000013 |
| optimizing                     | 0.000021 |
| statistics                     | 0.000020 |
| preparing                      | 0.000017 |
| executing                      | 0.004047 |
| end                            | 0.000013 |
| query end                      | 0.000004 |
| waiting for handler commit     | 0.000009 |
| closing tables                 | 0.000010 |
| freeing items                  | 0.000020 |
| cleaning up                    | 0.000012 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.00 sec)
  • 5.利用trace分析优化器
-- 打开trace,设置格式为JSON
SET OPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=on;
-- 设置trace最大能够使用的内存大小
SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;

-- 检查文件可以知道Mysql是如何执行SQL

SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE\G
  • 6.确定问题并采取相应的优化措施

创建新的索引,减少需要扫描的行数

索引的使用可以大大提高数据库的访问速度

2.索引

索引是在MySQL的存储引擎层中实现的,不是在服务器层实现

不同的存储引擎有不同的索引类型和实现

1.索引的分类

  • B-Tree索引,最常见的索引类型

经典的B树结构,可以进行全关键字、关键字范围和关键字前缀查询innoDB的B+Tree索引分为主索引和辅助索引

  • HASH索引,只有Memory引擎支持,使用场景简单

hash索引适合key-value查询,hash索引要比b-tree索引查询更迅速

  • R-Tree索引(空间索引),MyISAM的一个特殊索引类型,使用较少
  • Full-text(全文索引),MyISAM的一个特殊索引类型,主要用于全文索引

BreakPoint

date:2020.06.28

Page:282—《深入浅出MySQL数据库开发优化》第18章SQL优化

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!