mysql简单介绍

mysql

配置文件(windows)

安装目录下的mysql.ini文件

#客户端配置
[client]
#mysql配置
[mysql]
#mysql服务器配置
[mysqld]
-----------------------------
default-storage-engine=INNODB //默认存储引擎

目录结构

bin //可执行文件
data //数据存储文件
docs //文档
include //包含头文件
lib //存储库文件
share //错误消息和字符集文件

修改提示符

mysql --prompt //修改登录后的提示符,即  mysql> ,例如:mysql -uroot -proot --prompt "test> "
prompt //登录后修改提示符,例如:例如:prompt test> 
可用配置参数 \B 完整日期 \d 当前db \h 主机名 \u当前用户

分类

ddl 数据定义语言,createalter...
tpl 事务处理语言,commitrollback...
dcl 数据控制语言,grent、...
dml 数据操作语言,insertupdate...

常用命令

SELECT VERSION(); //当前服务器版本
SELECT NOW();  //当前日期
SELECT USER();  //当前用户
set names gbk;  //cmd窗口 使用gbk编码显示查询到的记录

sql语句规范

关键字与函数名称全部大写(推荐) 数据库名称,表名称,字段名称全部小写 sql语句必须以分号结尾

语法

创建数据库

CREATE DATABASE [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset;

查看数据库信息

//显示所有(匹配)的数据库
SHOW DATABASES [LIKE 'pattern' | WHERE expr];
//显示所有的表
SHOW TABLES [FROM db];
//显示所有的列
SHOW COLUMNS FROM table;
DESC table;

查看错误信息

SHOW WARNINGS;

查看已创建数据库的创建命令

SHOW CREATE DATABASE db_name;

修改数据库编码

ALTER DATABASE db_name [DEFAULT] CHARACTER SET charset;

删除数据库

DROP DATABASE [IF EXISTS] db_name;

查看锁竞争情况

//表级锁竞争
SHOW STATUS LIKE 'Table%';
//Table_locks_immediate  指的是能够立即获得表级锁的次数
//Table_locks_waited  指的是不能立即获取表级锁而需要等待的次数

//innodb行锁竞争
SHOW STATUS LIKE 'innodb_row_lock%';

//查看锁id
SHOW PROCESSLIST;

//解锁:谨慎操作
KILL id;
UNLOCK TABLES;

//锁表:
//锁定数据表,避免在备份过程中,表被更新
LOCK TABLES tb_name READ;
//为表增加一个写锁定
LOCK TABLES tbl_name WRITE;

数据类型

整型

类型    数据范围
tinyint  2^8
smallint  2^16
mediumint  2^24
int  2^32
bigint 2^64

浮点型

float  单精度浮点
double 双精度浮点

日期类型

yeartime   时间
date   日期
datetime   日期和时间
timestamp  时间戳

字符类型

char(m) 最大255varchar(m) 最大65535
tinytext 2^8
text  2^16
mediumtext  2^24
longtext  2^32
enum('v1','v2') 最多65535
set('v1','v2')  最多64

数据表操作

打开数据库/选择数据库

USE db_name;

创建数据表

CREATE TABLE [IF NOT EXISTS] tb_name (
	column_name data_type [NULL | NOT NULL] [PRIMARY KEY] [AUTO_INCREMENT] [DEFAULT val],
);
//使用无符号需要在类型后面使用 unsigned
//使用primary key设置主键
//使用自增auto_increment为主键,默认为1,增量为1
// (id int unsigned primary key auto_increment);
//唯一约束:unique key
// (username varchar(10) not null unique key);
//默认值:default 
// (dft varchar(10) not null default 'dft');

插入记录

INSERT [INTO] tb_name [(column1,column2,...)] VALUES (value1,value2,...);

查询数据

SELECT expr,... FROM tb_name;

约束

保证数据的完整性和一致性 表级约束,列级约束

NOT NULL 非空约束
PARMARY KEY 主键约束
UNIQUE KEY 唯一约束
DEFAULT 默认约束
FOREIGN KEY 外键约束

外键约束

//只能使用innoDB存储引擎
FOREIGN KEY (column) REFERENCES tb_name (column);
外键约束参照:
CASCADE 级联更新
SET NULL 设置为null
RESTRICT 拒绝操作
NO ACTION 无操作
//ON DELETE RESTRICT ON UPDATE CASCADE

修改数据表

//添加字段
ALTER TABLE tb_name ADD [COLUMN] col_name col_type [FIRST | AFTER col_name];
//添加多个
ALTER TABLE tb_name ADD [COLUMN]
(col_name col_type [NOT NULL | NULL],...);
//删除列
ALTER TABLE tb_name DROP [COLUMN] col_name,DROP [COLUMN] col_name,...;
//添加主键约束
ALTER TABLE tb_name ADD [CONSTRAINT [name]] PRIMARY KEY (COLUMN);
//添加唯一约束
ALTER TABLE tb_name ADD [CONSTRAINT [name]] UNIQUE KEY (col1,col2,...);
//添加外键约束
ALTER TABLE tb_name ADD [CONSTRAINT [name]] FOREIGN KEY (COLUMN) REFERENCES table (COLUMN) [ON DELETE [opt] |ON UPDATE [opt]];
//修改默认约束
ALTER TABLE tb_name ALTER [COLUMN] col_name SET DEFAULT def_value;
//删除默认约束
ALTER TABLE tb_name ALTER [COLUMN] col_name DROP DEFAULT ;
//删除主键约束
ALTER TABLE tb_name DROP PRIMARY KEY ;
//删除唯一约束
ALTER TABLE tb_name DROP [KEY] key_name;
//删除外键约束
ALTER TABLE tb_name DROP FOREIGN KEY key_name;
//修改列定义
ALTER TABLE tb_name MODIFY [COLUMN] col_name col_type [first|after col_name];
//修改列名
ALTER TABLE tb_name CHANGE [COLUMN] old_name new_name col_type;
//修改表名
ALTER TABLE tb_name RENAME new_tb_name;
RENAME TABLE tb_name TO new_tb_name,tb to ntb,...;
//创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tb_name (col_name,col_name,...);
//添加索引
ALTER TABLE ta_name ADD [UNIQUE|FULLTEXT] INDEX index_name ON (col_name,col_name,...);
//删除索引
DROP INDEX index_name ON ta_name;

查看约束/索引名称

SHOW INDEX FROM tb_name;

增删改查

//添加记录
INSERT [INTO] tb_name [(col1,col2,...)] VALUES (val1,val2,...),(...),...;
INSERT [INTO] tb_name SET col1=val1,col2=val2,...;
INSERT [INTO] tb_name [(col1,col2,...)] SELECT col1,col2,... FROM tb_name;
//更新记录
UPDATE tb_name SET col1=val1,col2=val2,... [WHERE expr]
//删除记录
DELETE FROM tb_name [WHERE expr]
//查询记录
SELECT col1 [[AS] other_name],col2 [[AS] other_name],... [FROM tb_name WHERE expr]
//分组查询
SELECT col1,... FROM tb_name GROUP BY col [ASC|DESC] [HAVING where_expr]
//排序
SELECT col1,... FROM tb_name [ORDER BY col [ASC|DESC]]
//分页查询,记录从0开始
SELECT col1,... FROM tb_name [LIMIT [OFFSET,]size]
SELECT col1,... FROM tb_name [LIMIT size OFFSET offset_num]

子查询

SELECT *,[(subquery)] FROM [(subquery)|tb_name] WHERE (subquery) = val
SELECT * FROM db_name WHERE val = [ANY|SOME|ALL] (sunquery)

连接

INNER JOIN 内连接,显示符合条件的记录,交集
LEFT [OUTER] JOIN 左外连接,显示左表全部和其他表符合条件的记录
RIGHT [OUTER] JOIN 右外连接,显示右表全部和其他表符合条件的记录
FULL [OUTER] JOIN 全外连接,mysql暂不支持,可以使用左连接和右连接查询,之后在使用union all将两个结果联合
CROSS JOIN 交叉连接,笛卡尔积查询
//连接查询
SELECT * FROM tb1 join_type tb2 ON join_condition
//多表更新
UPDATE tb_name join_type other_tb ON join_condition SET col1 = val1,... WHERE expr
//多表删除
DELETE [alias] FROM tb_name [alias] join_type other_tb ON join_cond WHERE expr

字符函数

CONCAT(char1,char2,...)  //字符连接
CONCAT_WS(split,char1,char2,...)  //字符连接,指定分隔符
FORMAT(num,pl) //数字格式化,返回字符,pl为小数点后保留位数
LOWER(chars)  //字符串小写
UPPER(chars)  //字符串大写
LEFT(chars,size) //获取字符前size位
RIGHT(chars,size) //获取字符最后size位
LENGTH(chars)  //字符串长度
LTRIM(chars),RTRIM(chars),TRIM([{leading|trailing|both} split FROM] chars)  //删除左,右,全部空格,{leading|trailing|both}为左,右,两侧的指定字符(split)去除
REPLACE(chars,old,new)  //将chars中的old替换为new
SUBSTRING(chars,f[,t])  //字符串截取,从f位开始截取t个,如果没有t表示到chars结尾,f可以为负数,指从最后开始
LIKE expr //模糊查询,(%:任意字符,_:任意一个字符),%1%% escape '1'为指定1后面的%为字符串而不是通配符

数值运算

CEIL()  //向上取整
FLOOR()  //向下取整
DIV  //整数除法,不计算小数
MOD  //取模运算,或者使用%
POWER()  //幂运算
ROUND()  //四舍五入
TRUNCATE()  //截断数字

比较运算

[NOT] BETWEEN ... AND ...   范围查询
[NOT] IN (1,2,...)   列表范围
IS [NOT] NULL 是否为空

日期运算

NOW()   //当前日期时间
CURDATE()  //当前日期
CURTIME()  //当前时间
DATE_ADD(date,interval num dtype)  //日期增加,dtype为日期单位(year|week|day|month...)
DATEDIFF(d1,d2)  //日期差值
DATE_FORMAT(date,format)  //日期格式化,(%Y年|%m月|%d日|%H时|%i分|%s秒)

信息函数

SELECT CONNECTION_ID();  //连接id
SELECT LAST_INSERT_ID();  //最后插入的自增id

聚合函数

AVG() 平均数
COUNT() 个数
MAX() 最大值
MIN() 最小值
SUM()

加密函数

MD5()  //md5值加密
PASSWORD() //计算mysql密码,5.7之前可以使用set password = password('pwd');修改mysql密码。

自定义函数

//函数参数最大值为1024,参数和返回值没有必然联系
CREATE [OR REPLACE] FUNCTION function_name([p1 type,p2 type,...]) RETURNS {string|integer|real|...} 
BEGIN
fun_body
[RETURN rtn]
END;
//如果有多个sql语句要执行,则需要修改结束符 ';',使用delimiter expr 修改,创建成功之后要重新修改为默认结束符;
//删除函数
DROP FUNCTION fun_name;

存储过程

//增强sql功能,加快速度,减少网络流量
//in,入参
//out,出参,使用 into 为出参赋值
//inout,出入参
CREATE  
[DEFINER = user]
PROCEDURE sp_name ([IN|OUT|INOUT] param_name type,...) 
BEGIN
body
END;
//调用存储过程,变量传递使用@param_name
CALL sp_name();
//删除存储过程
DROP PROCEDURE sp_name;

存储引擎

//锁:行锁和表锁
//事务特征:原子性,隔离性,一致性,持久性
//创建数据表是使用engine=e_name指定存储引擎,或者使用以下语句修改存储引擎
ALTER TABLE tb_name ENGINE = e_name
特点 MyISAM InnoDB Memory Archive
存储限制 256TB 64TB 内存大小
事务支持 支持
索引支持 支持 支持 支持
锁粒度 表锁 行锁 表锁 行锁
数据压缩 支持 支持
外键支持 支持

5.7特点

//初始化命令
mysqld --initialize --user=mysql --basedir=path --datadir=path
//增加计算列
//引入json类型

技巧

join 技巧
//更新的表在from从句中的,不允许更新,可以使用*多表更新*处理
//使用join代替在查询列中的子查询,即将select col,(sunquery) from t 替换为 select col,col2 from t1 join t2
//避免子查询,将在条件中的子查询使用join来代替

行列转换
//行转列:将查询到的每个数据横向显示,如日期
//使用case when cond then expr end 进行行列转换,需要将所有的列名进行穷举
//列转行:将以多个数据以分隔符进行分隔的时候转换为多行
//创建一个只有一个自增数据的序列表,计算每个数据中单独数据的个数,通过连接序列表并指定序列id小于等于个数,然后截取数据中的每个数据
//列转行:将同一个人的多个数据列,转换为多行显示
//多次查询特定的列,然后使用union all连接
//使用原表与序列化表笛卡尔积的方式关联将一行变成多行,然后使用case进行判断,使用coalesce()函数将结果中为null的列去除

唯一序列号
//使用自增主键auto_increment
//使用序列表生成序列号

删除重复数据
//使用group by having查询重复数据
//查询id最大或最小的数据,使用*多表删除*处理重复数据

多列过滤
//where可以使用多列过滤,where (c1,c2,...) in (select c1,c2,... from tb)

多属性查询
//查询一个数据是否具有某几个属性,使用多次关联,每次关联一种属性,条件中将不为null的值使用case输出为1,否则为0,然后相加大于需要的个数
//使用关联之后分组查询,取出结果数量大于需要的数量的结果

阶段计算税额
//使用join连接查询得到跨越税率区间数的数据行,使用least函数计算区间中的值,然后再进行计算税额之后统计即可

优化

慢查询日志:

SHOW VARIABLES LIKE '%slow_query%';//查看慢查询日志是否开启和存储位置
SET GLOBLE log_queries_not_using_indexes=on;//设置将未使用索引的慢查询加入日志
SHOW variables like 'long_query_time';//慢查询的限制时间
SET long_query_time=3.00;//设置慢查询的限制时间

慢查询日志格式:

//执行时间
# Time: 190103 13:59:24
//执行sql的主机信息
# User@Host: root[root] @ localhost [127.0.0.1]
//sql的执行信息,发送行数,扫描行数
# Query_time: 0.000997  Lock_time: 0.000997 Rows_sent: 2  Rows_examined: 2
//sql的执行时间
SET timestamp=1546495164;
//sql的内容
select * from store limit 10;

慢查询分析工具:

mysqldumpslow //慢查日志分析,mysql自带的工具
//mysqldumpslow -t 10 path | more
pt-query-digest  //需要下载安装的工具
//pt-query-digest path | more

执行计划:

EXPLAIN sql_string//显示sql的执行计划
返回列说明:
select_type //查询类型,https://www.cnblogs.com/danhuangpai/p/8475458.html
table //数据表
type //连接类型,从好到差为const,eq_reg,ref,range,index,all
possible_keys //显示可能应用在这张表的索引,为空表示没有可能的索引
key //实际使用的索引,空表示没有使用
key_len //使用索引的长度,在不损失精度的情况下,长度越短越好
ref //显示索引的哪一列被使用,可能为一个常数
rows //表扫描的行数
Extra // using filesort 使用文件排序,出现表示可能需要优化sql,using temporary 使用临时表存储结果,出现表示可能需要优化sql

sql优化:

MAX() //查询可以使用索引优化
COUNT(指定列) //执行不包含为null的值
子查询 //如果子查询中有多条数据,转换为join时需要去重
GROUP BY //子查询和连接方式灵活修改
LIMIT //尽量使用主键进行排序操作,可以添加where id > lastpage条件(id为连续增长),然后再分页

索引优化:

sql语句中条件判断的列上建立索引,索引的字段越小越好,离散度大的列放在联合索引的前面
//离散度表示当前列值的范围 
pt-duplicate-key-checker -uuser -p 'pwd' -h host //索引检测
pt-index-usage -uuser -p '' slow.log //检测不使用的索引

数据库结构优化:

选择合适的数据类型 //选择可以存下数据的最小的类型
选择简单的数据类型 //int比varchar处理简单
尽可能使用NOT NULL并指定默认值
尽量少用TEXT等数据类型
//使用int存储IP地址,使用int存储时间等

范式化:第三范式要求,存在传递性依赖的不符合
反范式化:添加冗余字段增加查询效率

垂直拆分:将多列拆分为多表,不常用,大字段单独存放,常用字段放在一起
水平拆分:按照id的hash进行拆分表,统计查询与前台查询分开,统计使用汇总表

系统优化:

网络配置:/etc/sysctl.conf
#增加tcp支持的队列数
net.ipv4.tcp_max_syn_backlog=65535
#减少断开连接,加快回收连接
net.ipv4.tcp_max_tw_buckets=8000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_recycle=1
net.ipv4.tcp_timeout=10
打开文件数限制:/etc/security/limits.conf
* sort nofile 65535
* hard nofile 65535
mysql配置优化:/etc/my.cnf  /etc/mysql/my.cnf  my.ini,查找配置文件的顺序(后面的会覆盖前面的配置) mysqld -verbose --help | grep -A 1 'Defaut options'
Innodb_buffer_pool_size //innodb缓存池大小
Innodb_buffer_pool_instance //缓存池的个数,默认为1,5.5新增
Innodb_log_buffer_size  //缓存日志大小
Innodb_flush_log_at_trx_commit //数据刷新到磁盘的配置,0(每秒刷新一次),1(默认,每次提交都刷新到磁盘),2(每次刷新提交到缓冲区,每秒刷新到磁盘,建议值)
Innodb_read_io_threads //读线程数,默认4
Innodb_write_io_threads //写线程数,默认4
Innodb_file_per_table //控制每一个表都使用独立的表空间,默认为off,即所有表都在共享表空间,建议设为on
Innodb_stats_on_metadata  //mysql统计信息刷新配置

//建议配置工具
https://tools.percona.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章