你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛!
死鬼~看完記得給我來個三連哦!
mysql
本文主要介紹 Mysql開發和麪試中所必知的
本文較長,分爲上下篇(可收藏,勿吃塵)
若有須要,能夠參考
若有幫助,不忘 點贊 ❥linux
MySQL是一個關係型數據庫管理系統,由瑞典MYSQL AB公司開發,目前屬於Oracle公司。
MySQL 是一種關聯數據庫管理系統,將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫中,這樣就增長了速度並提升了靈活性。
Mysql是開源的,是能夠定製的,採用了GPL協議,你能夠修改源碼來開發本身的MySQL系統。
MySQL支持大型的數據庫。能夠處理擁有上千萬條記錄的大型數據庫。MySQL能夠容許於多個系統上,而且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
MySQL支持大型數據庫,支持5000條記錄的數據倉庫,32位系統表文件最大可支持4GB,64位系統支持最大的表文件爲8TB。ios
binlog(二進制日誌)
[mysqld]
log-bin = mysql-bin
binlog-format = row
複製代碼
Error log(錯誤日誌)
[mysqld]
log-error=/data/mysql_error.log
複製代碼
慢查詢日誌log
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log //linux
long_query_time = 1
複製代碼
數據文件
..\mysql-8.0.19-winx64\data
目錄下存儲數據庫文件/var/lib/mysql
(可在配置文件中更改/usr/share/mysql/下的my-huge.cnf)每一個目錄表明一個同名的庫。配置方式
MysSQL用戶管理
權限管理
大小寫問題
windows系統默認是大小寫不敏感,可是linux系統是大小寫敏感的。web
- 0(默認): 大小寫敏感
- 1: 大小寫不敏感。建立的表,數據庫都是以小寫形式存放在磁盤中,對於sql語句都是轉換爲小寫對錶的DB進行查找。
- 2: 建立的表和DB依據語句上格式存放,凡是查找都是轉換爲小寫進行
SHOW VARIABLES LIKE '%lower_case_table_names%';
複製代碼
set lower_case_table_names = 1; #此變量是隻讀權限,須要在配置文件中修改
複製代碼
[mysqld]
lower_case_table_names = 1
複製代碼
sql_mode
sql_mode 是個很容易被忽視的變量,默認值是空值,在這種設置下是能夠容許一些非法操做的, 好比容許一些非法數據的插入。在生產環境必須將這個值設置爲嚴格模式,因此開發、測試環境的數據庫也必需要設置,這樣在開發測試階段就能夠發現問題。面試
經常使用設置:算法
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
複製代碼
查看引擎
show engines;
複製代碼
各引擎簡介
sql
事務型引擎
,它被設計用來處理大量的短時間(short-lived)事務。除非有很是特別的緣由須要使用其餘的存儲引擎,不然應該優先考慮InnoDB引擎。具備行級鎖
,外鍵
,事務
等優點,適合高併發狀況
。不支持事務和行級鎖(MyISAM改表時會將整個表全鎖住)
,缺陷:崩潰後沒法安全恢復
。只支持 insert 和 select
操做,在MySQL5.1以前不支持索引。Archive表適合日誌和數據採集類引用。適合低訪問量大數據等狀況
。MyISAM和InnoDB比較
數據庫
列
建索引,但並不可能每一列都建索引SQL執行順序編程
人工讀取順序:
windows
SELECT (DISTINCT)
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition>
ORDER BY
< order_by_condition >
LIMIT < limit_number >
複製代碼
引擎執行順序:
FROM < left_table >
ON < join_condition >
< join_type > JOIN < right_table >
WHERE < where_condition >
GROUP BY < group_by_list >
HAVING < having_condition >
SELECT
(DISTINCT) < select_list >
ORDER BY < order_by_condition >
LIMIT < limit_number >
複製代碼
總結:
共有:
知足employee.deptId = dept.id 的數據 稱爲兩表共有獨有:
employee.deptId <> dept.id 的數據 稱爲員工表獨有一、
t1 表和 t2 表共有 (inner join)
select * from emp t1 inner join dept t2 on t1.deptId = t2.id
複製代碼
二、
t1 表和 t2 表共有 + t1 表獨有 (left join)
select * from emp t1 left join dept t2 on t1.deptId = t2.id
複製代碼
三、
t1 表和 t2 表共有 + t2表獨有(right join)
select * from emp t1 right join dept t2 on t1.deptId = t2.id
複製代碼
四、
t1 表的獨有(left join…where t2.id is null)
select * from emp t1 left join dept t2 on t1.deptId = t2.id where t2.id is null
複製代碼
5.
t2 表的獨有(right join…where t1.id is null)
6.
t1 表和 t2 表全有(
union)
select * from emp t1 left join dept t2 on t1.deptId = t2.id
union
select * from emp t1 right join dept t2 on t1.deptid = t2.id
複製代碼
七、
t1 表的獨有 + t2 表的獨有(union)
select * from emp t1 left join dept t2 on t1.deptId = t2.id where t2.id is null
UNION
select * from emp t1 right join dept t2 on t1.deptId = t2.id
where t1.deptId is null
複製代碼
MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。能夠獲得索引的本質:索引是數據結構。 目的在於提升查詢效率,能夠類比字典。
簡單理解爲 「排好序的快速查找數據結構」 :
在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據。
插入/修改
操做過多時,B-TREE會不斷調整平衡,消耗性能。通常來講索引自己也很大,不可能所有存儲在內存中,所以索引每每以索引文件的形式存儲在磁盤上。
咱們日常所說的索引,若是沒有特別指明,都是指B樹 (多路搜索樹,並不必定是二叉的)結構組織的索引。其中彙集索引,次要索引,覆蓋索引,複合索引,前綴索引,惟一索引默認都是使用B+樹這種類型的索引以外,還有哈希索引(hash index)等。
索引優點
索引劣勢
索引結構
真實數據存在於葉子節點
,即三、五、九、十、1三、1五、2八、2九、3六、60、7五、7九、90、99.非葉子節點不存儲真實的數據,只存儲指引搜索方向的數據項
,如1七、35並不真實存在於數據表中。【B+Tree 和 BTree 的區別】
1) 內存有限的狀況下,B+Tree永遠比BTree好,無限內存則反之
2) B樹的關鍵字和記錄是放在一塊兒的,葉子節點能夠看作外部節點,不包含任何信息;B+樹葉子節點中國你只有關鍵字和指向下一個節點的索引,記錄只放在葉子節點中。(一次查詢可能進行兩次I/O操做)
3) 在B樹中,越靠近根節點的記錄查找時間越快,只要找到關鍵字便可肯定記錄存在;而B+樹每一個記錄的查找時間基本是同樣的,都須要從根節點走到葉子節點,並且在葉子節點中還要在比較關鍵字。從這個角度看B樹的性能好像會比B+樹好,而在實際應用中倒是B+樹的性能要好些。由於B+樹的非葉子節點不存放實際的數據,這樣每一個節點可容納的元素個數比B數多,樹高比B樹小,這樣帶來的好處是減小磁盤訪問次數。儘管B+樹找到一個記錄所需的比較次數比B樹多可是一次磁盤訪問時間至關於成百上千次內存比較時間,所以實際中B+樹的性能可能還會好寫,並且B+樹的葉子節點使用指針鏈接在一塊兒,方便順序遍歷(例如查看一個目錄下的全部文件,一個表中的全部記錄等)
4) B+樹的磁盤讀寫代價更低,相對來講IO讀寫次數也就下降了。
5) B+樹的查詢效率更加穩定。因爲非終結點並非指向文件內容的節點,而只是葉子節點中關鍵字的索引。因此任何關鍵字的查找必須走一條從根節點到葉子節點的路。因此關鍵字查詢的路徑長度相同,致使每個數據的查詢效率至關。
聚簇索引
好處:
限制:
full-text全文索引
全文索引(也稱全文檢索)是目前搜索引擎使用的一種關鍵技術。它可以利用
分詞技術
等多種算法智能分析出文本文字中關鍵詞的頻率和重要性,而後按照必定的算法規則智能地篩選出咱們想要的搜索結果。
查詢:
# 傳統 LIKE 查詢
select * from blink t1 where t1.content like '%菜%'
# 全文檢索
select * from blink t1 where MATCH(title,content) AGAINST('菜')
複製代碼
限制:
MySQL5.6.4以前只用MyISAM 支持,5.6.4之後 InnoDB才支持,可是官方版不支持中文分詞,須要第三方分詞插件。Hash索引
RTree索引
R-Tree在MySQL不多使用,僅支持geometry 數據結構,支持該類型的存儲引擎只有MyISAM、bdb、InnoDB、ndb、archive幾種。相對於B-Tree,R-Tree的優點在於查找
。
索引分類
語法:
# 隨表一塊兒建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT關鍵字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, NAME varchar(8)
, PRIMARY KEY(ID)
)
# 單獨建主鍵索引
ALTER TABLE emp add PRIMARY KEY emp(id);
# 刪除主鍵索引
ALTER TABLE emp drop PRIMARY KEY; # 修改主鍵索引前必須刪除(drop)原索引,再新建(add)索引
複製代碼
語法:
# 隨表一塊兒建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT關鍵字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, KEY(EMP_NO)
)
# 單獨建單列索引
create index idx_emp_no on emp(EMP_NO)
# 刪除單列索引
drop index idx_emp_no
複製代碼
# 隨表一塊兒建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT關鍵字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, UNIQUE(EMP_NO)
)
# 單獨建惟一索引
create unique index idx_emp_no on emp(EMP_NO)
# 刪除主鍵索引
drop index idx_emp_no on emp
複製代碼
# 隨表一塊兒建立
CREATE TABLE emp (
# 使用AUTO_INCREMENT關鍵字的列必需要有索引
ID int(10) UNSIGNED AUTO_INCREMENT
, EMP_NO varchar(8)
, NAME varchar(8)
, key(EMP_NO,NAME)
)
#創建惟一索引是必須保證全部的值是惟一的(除了null),如有重複數據,會報錯
# 單獨建惟一索引
create index idx_no_name on emp(EMP_NO,NAME)
# 刪除主鍵索引
drop index idx_no_name on emp
複製代碼
【基本語法】
# 建立
alter < table_name > add [unique] index <index_name> on <column_name>
# 刪除
drop index <index_name> on <table_name>
#查看
show index from <table_name>
#使用ALTER命令
#方式1:該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲null
alter table <table_name> add primary key <column_name>
#方式2:該語句添加一個惟一索引,值必須是惟一的(null外,null可能會出現不少次)
alter table <table_name> add unique key <column_name>
#方式3:該語句添加普通索引,索引值能夠出現不少次
alter table <table_name> add index <index_name>(column_name)
#方式4:該語句指定了索引爲FULLTEXT,用戶全文索引
alter table <table_name> add FULLTEXT <index_name>(column_name)
複製代碼
哪些狀況須要創建索引
哪些狀況不須要創建索引
MySQL常見瓶頸
服務器硬件的性能瓶頸:
top,free,iostat和vmstat來查看系統的性能狀態
Explain的使用
使用Explain關鍵字能夠模擬優化器執行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸
explain + SQL語句
1.【 id】
select查詢的序列號,包含一組數字,表示查詢中執行select字句或操做表的順序。
三種狀況:
id相同,執行順序由上至下
id不一樣,若是是子查詢,id的序號會遞增,id值越大優先級越高,越被先執行
id相同和不一樣同時存在
id若是相同,能夠認爲是一組,從上往下順序執行;在全部組中,id值越大,優先級越高,越先執行。
2.【select_type】
【dependent subquery 和 subquery 的區別】
3.【table】
顯示這一行的數據是關於哪張表的4.【type】
type顯示的是訪問類型,是較爲重要的一個指標,結果值從最好到最壞的依次排序:
system > const > eq_ef > ref
> range(儘可能保證)
> index > ALL
通常來講,得保證查詢至少達到range級別,最好能達到ref
5.【possible_keys】
顯示可能應用到這張表中的索引,一個或多個。查詢涉及到的字段上若存在的索引,則該索引將被列出,但不必定被查詢實際使用
6.【key】
實際使用的索引,若是爲NULL,則沒有使用索引。查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊。
7.【key_len】
表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度。key_len字段可以幫你檢查是否充分利用上了索引。
8.【ref】
9.【row】
10.【Extra】
覆蓋索引:
索引的使用
10.少用or,用它鏈接時索引會失效
【例子小節】
此時複合索引index(a,b,c)
【使用建議】
關聯查詢優化
# 未加索引,type爲ALL
explain select * from class left join book on class.card = book.card
# 添加索引優化,第二行的type變成了ref
alter table book add index idx_card_B(card);
# 這是由左鏈接特效決定的,left join條件用於肯定如何從右表搜索行,左邊必定都有
# 繼續優化,刪除舊索引,新建新索引
drop index idx_card_B on book;
alter table class add index idx_card_A(card)
複製代碼
子查詢優化
order by關鍵字優化
例子:talA 表中有索引 (age,birth,name)
分頁查詢的優化--limit
explain select sql_no_chache * from emp order by deptno limit 10000,40
複製代碼
#加上索引
create index emp on emp(deptno)
複製代碼
# 經過以上結果能夠看出加上索引並不能改變
# 進一步優化:先利用覆蓋索引把要取的數據行的主鍵取到,而後再用這個主鍵列與數據表作關聯(查詢數據量小了後)
explain select sql_no_cache * from emp e inner join (select id from emp e order by deptno limit 10000,40)a on a.id = e.id
複製代碼
GROUP BY 關鍵字優化
去重優化
例子:
# 使用distinct關鍵字去重消耗性能
select distinct BOOK_NAME from book where id in(1,2,5,4,8)
# 使用 group by可以利用到索引
select BOOK_NAME from book where id in(1,2,5,4,8) group by BOOK_NAME
複製代碼
本文較長,能看到這裏的都是最棒的!成長之路學無止境~
今天的你多努力一點,明天的你就能少說一句求人的話!好久好久以前,有個傳說,聽說:
看完不讚,都是壞蛋