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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章