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 數據定義語言,create、alter、...
tpl 事務處理語言,commit,rollback、...
dcl 數據控制語言,grent、...
dml 數據操作語言,insert、update、...
常用命令
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 雙精度浮點
日期類型
year 年
time 時間
date 日期
datetime 日期和時間
timestamp 時間戳
字符類型
char(m) 最大255個
varchar(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