数据库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 逻辑运算符
逻辑运算符也称为布尔运算符
NOT !
AND &&
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优化
来源:oschina
链接:https://my.oschina.net/u/4397642/blog/4328521