读书笔记 —— 《深入浅出MySQL数据库开发、优化与管理维护 第2版》
目錄
第1章 Mysql的安裝與配置
1.1 啟動和關(guān)閉Mysql服務(wù)
第2章 SQL基礎(chǔ)
2.1 SQL分類
2.2 常用語句
第3章 Mysql支持的數(shù)據(jù)類型
3.1 數(shù)值類型
3.2 日期時間類型
3.3 字符串類型
第4章 Mysql中的運算符
4.1 運算符優(yōu)先級
第7章 表類型(存儲引擎)的選擇
7.1 各種存儲引擎的特性
7.2 MyISAM
7.3 InnoDB
7.4?MEMORY
第8章 選擇合適的數(shù)據(jù)類型
8.1 CHAR和VARCHAR
8.2 TEXT和BLOB
8.3 浮點數(shù)和定點數(shù)
8.4 日期類型選擇
第10章 索引的設(shè)計與使用
第13章 觸發(fā)器
第14章 事務(wù)控制和鎖定語句
14.1 LOCK TABLE 和 UNLOCK TABLE
14.2 事務(wù)控制
第17章 Mysql分區(qū)
17.1 概述
17.2 分區(qū)類型
第18章 SQL優(yōu)化
18.1?定位執(zhí)行效率低的SQL語句
18.2 EXPLAIN
18.3 索引的存儲分類
18.4 B-Tree索引
18.5 MYSQL中能使用索引的典型場景
18.6 存在索引但不能使用索引的典型場景
18.7 查看索引使用情況
18.8 兩個簡單實用的優(yōu)化方法
18.9 常用的SQL優(yōu)化
第19章 優(yōu)化數(shù)據(jù)庫對象
第20章 鎖問題
20.1 MySQL鎖概述
20.2 MyISAM表鎖
20.3 事務(wù)
20.4 InnoDB行鎖
20.5 InnoDB表鎖
第1章 Mysql的安裝與配置
1.1 啟動和關(guān)閉Mysql服務(wù)
Windows(管理員命令行下)
- 啟動服務(wù):net start mysql
- 關(guān)閉服務(wù):net stop?mysql
Linux
- 啟動服務(wù):service mysql start
- 重啟服務(wù):service mysql restart
- 關(guān)閉服務(wù):service mysql stop
第2章 SQL基礎(chǔ)
2.1 SQL分類
- DDL(Data Definition Languages):數(shù)據(jù)定義語言,這些語句定義了不同的數(shù)據(jù)段、數(shù)據(jù)庫、表、列、索引等數(shù)據(jù)庫對象,常用的關(guān)鍵字包括 create、drop、alter
- DML(Data Manipulation Language):數(shù)據(jù)操縱語句,用于添加、刪除和更新數(shù)據(jù)庫記錄,并檢查數(shù)據(jù)完整性,常用關(guān)鍵詞 包括 insert、delete、update等
- DQL(Data Query Language):數(shù)據(jù)查詢語句,用于查詢數(shù)據(jù)庫記錄,常用關(guān)鍵詞包括 select
- DCL(Data Control Language):數(shù)據(jù)控制語句,用于控制不同數(shù)據(jù)段之間的許可和訪問級別的語句,這些語句定義了數(shù)據(jù)庫、表、字段、用戶的訪問權(quán)限和安全級別,主要關(guān)鍵詞包括 grant、revoke
2.2 常用語句
DDL語句
- 創(chuàng)建數(shù)據(jù)庫:CREATE DATABASE db_name;
- 查看全部數(shù)據(jù)庫:SHOW DATABASES;
- 選擇數(shù)據(jù)庫:USE db_name;
- 查看全部數(shù)據(jù)表:SHOW TABLES;
- 刪除數(shù)據(jù)庫:DROP DATABASE db_name;
-
創(chuàng)建數(shù)據(jù)表:CREATE TABLE [IF NOT EXISTS] ` table_name ` (
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? column_name data_type, ...?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?)ENGINE=InnoDB DEFAULT CHARSET=utf-8
- 查看數(shù)據(jù)表定義:DESC table_name; / SHOW CREATE TABLE table_name \G;
- 刪除數(shù)據(jù)表:DROP TABLE table_name;
- 清空數(shù)據(jù)表:TRUNCATE TABLE table_name;
- 修改表字段:ALTER TABLE table_name MODIFY [COLUMN] col_definition [FIRST | AFTER col_name];
- 增加表字段:ALTER TABLE table_name ADD [COLUMN] col_definition [FIRST | AFTER col_name];
- 刪除表字段:ALTER TABLE table_name DROP [COLUMN] col_name;
- 字段改名:ALTER TABLE table_name CHANGE [COLUMN] old_col_name new_col_definition [FIRST | AFTER col_name];
- 更改表名:ALTER TABLE table_name RENAME new_table_name;
DML語句
- 增:INSERT INTO table_name (field1,field2 ...) VALUES (value1,value2 ...);
- 刪:DELETE FROM table_name [WHERE CONDITION];
- 改:UPDATE table_name SET field1 = value1, field2 = value2 ... [WHERE CONDITION];
DQL語句
- 查:SELECT * FROM table_name [WHERE CONDITON];
- 查詢不重復(fù)的記錄:SELECT DISTINCT field FROM table_name;
- 排序:SELECT * FROM table_name [WHERE CONDITION] [ORDER BY field [DESC / ASC]];
- 截取:SELECT ... [LIMIT offset_start, row_count];? ? // offset_start:起始偏移量(默認為0),row_count:顯示的行數(shù)
- 聚合:
- ?左/右連接:SELECT field FROM table_name1 LEFT/RIGHT JOIN table_name2 ON CONDITION;
第3章 Mysql支持的數(shù)據(jù)類型
3.1 數(shù)值類型
- Mysql支持在類型名稱后面的小括號內(nèi)指定顯示寬度,例如int(5)表示當數(shù)值寬度小于5位的時候再數(shù)字前面填滿寬度,如果不顯示指定寬度則默認為int(11)
- 所有的整數(shù)類型都有一個可選屬性UNSIGNED(無符號),如果需要在字段里面保存非負數(shù)或者需要較大的上限值時,可以用此選項
- AUTO_INCREMENT:在需要產(chǎn)生唯一標識符或順序值時,可用此屬性,必須定義為NOT NULL
- float和double在不指定精度時,默認會按照實際的精度(由實際的硬件和操作系統(tǒng)決定)來顯示,而decimal在不指定精度時,默認的整數(shù)位為10,默認小數(shù)位為0
3.2 日期時間類型
3.3 字符串類型
- ?CHAR是固定長度,刪除尾部空格;VARCHAR是可變長度,保留尾部空格
第4章 Mysql中的運算符
4.1 運算符優(yōu)先級
第7章 表類型(存儲引擎)的選擇
7.1 各種存儲引擎的特性
7.2 MyISAM
7.3 InnoDB
7.4?MEMORY
? ? ?MEMORY存儲引擎使用存在于內(nèi)存的內(nèi)容來創(chuàng)建表。每個MEMORY表只實際對應(yīng)一個磁盤文件,格式是.frm。MEMORY類型的表訪問非常地塊,因為它的數(shù)據(jù)是放在內(nèi)存中的,并且默認使用HASH索引,但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會丟失掉。
第8章 選擇合適的數(shù)據(jù)類型
8.1 CHAR和VARCHAR
8.2 TEXT和BLOB
? ? ? ? BLOB和TEXT值會引起一些性能問題,特別是在執(zhí)行了大量刪除操作時。刪除操作會在數(shù)據(jù)表中留下很大的“空洞”,以后填入這些“空洞”的記錄在插入的性能上會有影響。為了提高性能,建議定期使用 OPTIMIZE TABLE table_name; 對表進行碎片整理,避免因為“空洞”導(dǎo)致性能問題。
8.3 浮點數(shù)和定點數(shù)
8.4 日期類型選擇
第10章 索引的設(shè)計與使用
MyISAM和InnoDB存儲引擎默認使用BTREE索引
可以用 explain 語句查看查詢語句是否使用索引
MEMORY可以使用HASH索引,只能用=或<=>操作符的等式比較
- 新增索引:ALTER TABLE table_name ADD INDEX index_name (column_list);
- 刪除索引:ALTER TABLE table_name DROP INDEX index_name;
- 查看索引:SHOW INDEX FROM table_name;
第13章 觸發(fā)器
觸發(fā)器是與表有關(guān)的數(shù)據(jù)庫對象,在滿足定義條件時觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合。
第14章 事務(wù)控制和鎖定語句
14.1 LOCK TABLE 和 UNLOCK TABLE
LOCK TABLES 可以鎖定用于當前線程的表。如果表被其他線程鎖定,則當前線程會等待,知道可以獲取所有鎖定為止
UNLOCK TABLE 可以釋放當前線程獲得的任何鎖定
當前線程執(zhí)行另一個LOCK TABLES時,或當與服務(wù)器的連接被關(guān)閉時,所有由當前線程鎖定的表被隱含地解鎖
14.2 事務(wù)控制
第17章 Mysql分區(qū)
17.1 概述
? ? ? 分區(qū)是指根據(jù)一定的規(guī)則,數(shù)據(jù)庫把一個表分解成多個更小的、更容易管理的部分。就訪問數(shù)據(jù)庫的應(yīng)用而言,邏輯上只有一個表或一個索引,但是實際上這個表可能由數(shù)10個物理分區(qū)對象組成,每個分區(qū)都是一個獨立的對象,可以獨自處理,可以作為表的一部分進行處理。分區(qū)對應(yīng)用來說是完全透明的,不影響應(yīng)用的業(yè)務(wù)邏輯
17.2 分區(qū)類型
第18章 SQL優(yōu)化
18.1?定位執(zhí)行效率低的SQL語句
18.2 EXPLAIN
字段解析
- select_type:表示SELECT的類型,常見的區(qū)志有SIMPLE(簡單表,即不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、UNION(UNION中的第二個或者后面的查詢語句)、SUBQUERY(子查詢中的第一個SELECT)等
- table:輸出結(jié)果集的表
- type;表示MYSQL在表中找到所需行的方式,或者叫訪問類型。常見類型有
- ALL:全盤掃描,MYSQL遍歷全表來找到匹配的行
- index:索引全掃描,MYSQL遍歷整個索引來查詢匹配的行
- range:索引范圍掃描,常見于<、<=、>、>=、between等操作符
- ref:使用非唯一索引掃描或唯一索引的前綴掃描,返回匹配某個單獨值的記錄行
- eq_ref:類似ref,區(qū)別就在使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配;簡單來說,就是多表連接中使用primaty key 或者 unique index 作為關(guān)聯(lián)條件
- prossible_keys:表示查詢時可能使用的索引
- key:表示實際使用的索引
- key_len:使用到索引字段的長度
- rows:掃描行的數(shù)量
- Extra:執(zhí)行情況的說明和描述,包含不適合在其他列中顯示但是對執(zhí)行計劃非常重要的額外信息
explain patitions:查看SQL所訪問的分區(qū)
18.3 索引的存儲分類
18.4 B-Tree索引
? ? ? ? B-Tree索引是最常見的索引,構(gòu)造類似二叉樹,能根據(jù)鍵值提供一行或者一個行集的快速訪問,通常只需要很少的讀操作就可以找到正確的行。B代表的是平衡樹(balanced),而不是二叉樹(binary)。B-Tree索引并不是一棵二叉樹。
18.5 MYSQL中能使用索引的典型場景
18.6 存在索引但不能使用索引的典型場景
18.7 查看索引使用情況
- 使用:show status like 'Handler_read&';
- Handler_read_key:如果索引正在工作,Handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數(shù),很低表明增加索引得到的性能改善不高,因為索引并不經(jīng)常使用
- Handler_read_rnd_next:值高意味著查詢運行低效,并且應(yīng)建立索引補救。這個值的含義是在數(shù)據(jù)文件中讀下一行的請求數(shù)。如果正進行大量的表掃描,值會很高,說明表索引不正確或?qū)懭氲牟樵儧]有利用索引
18.8 兩個簡單實用的優(yōu)化方法
18.9 常用的SQL優(yōu)化
大批量插入數(shù)據(jù)
MyISAM:
ALTER TABLE table_name DISABLE KEYS; load data infile ... ALTER TABLE table_name ENABLE KEYS;InnoDB:
- 因為InnoDB類型的表是按照主鍵的順序保存的,所以將導(dǎo)入的數(shù)據(jù)按照主鍵的順序排列,可以有效地提高導(dǎo)入數(shù)據(jù)的效率
- 在倒入數(shù)據(jù)前執(zhí)行SET UNIQUE_CHECKS=0,關(guān)閉唯一性校驗,在導(dǎo)入結(jié)束后執(zhí)行 SET UNIQUE_CHECKS=1,恢復(fù)唯一性檢驗,可以提高導(dǎo)入效率
- 如果應(yīng)用使用自動提交的方式,建議在導(dǎo)入前執(zhí)行SET AUTOCOMMIT=0,關(guān)閉自動提交,導(dǎo)入結(jié)束后再執(zhí)行SET AUTOCOMMIT=1,打開自動提交,也可以提高導(dǎo)入的效率
優(yōu)化INSERT語句
- 如果可以同時從一個客戶端插入很多行,應(yīng)盡量使用多個值表的INSERT語句,這種方式將大大縮減客戶端與數(shù)據(jù)庫之間的連接、關(guān)閉等消耗,使得效率比分開執(zhí)行的單個INSERT語句塊
優(yōu)化ORDER BY語句
Mysql有兩種排序方式
優(yōu)化方案:盡量減少額外的排序,通過索引直接返回有序數(shù)據(jù)。WHERE 條件和 ORDER 條件使用相同的索引,并且ORDER BY 的順序和索引順序相同,并且ORDER BY 的字段都是升序或者都是降序。否則肯定需要額外的排序,這樣就會出現(xiàn)Filesort
優(yōu)化GROUP BY語句
如果查詢包括GROUP BY 但用戶想要避免排序結(jié)果的消耗,則可以指定ORDER BY NULL 禁止排序
e.g. explain select payment_date, sum(amont) from payment group by payment_date order by null\G;
優(yōu)化OR條件
如果要使用索引,OR之間的每個條件都必須用到索引,如果沒有索引,應(yīng)該考慮增加索引。不能是復(fù)合索引
用RAND()提取隨機行
隨機抽取5行:select * from category order by rand() limit 5;
第19章 優(yōu)化數(shù)據(jù)庫對象
優(yōu)化表的數(shù)據(jù)
SELECT * FROM table_name PROCEDURE ANALYSE();使用PROCEDURE ANALYSE(); 對當前應(yīng)用的表進行分析,該函數(shù)可以對數(shù)據(jù)表中列的數(shù)據(jù)類型提出優(yōu)化建議,用戶可以根據(jù)應(yīng)用的實際情況酌情考慮是否實施優(yōu)化。
通過拆分提高表的訪問效率
反規(guī)范化
反規(guī)范化的好處是降低連接操作的需求、降低外碼和索引的數(shù)目,還可能減少表的數(shù)目,響應(yīng)帶來的問題是可能出現(xiàn)數(shù)據(jù)的完整性問題。加快查詢速度,但會降低修改速度。
使用中間表提高統(tǒng)計查詢速度
第20章 鎖問題
20.1 MySQL鎖概述
- 表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低
- 行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度小,發(fā)生鎖沖突的概率最低,并發(fā)度最高
20.2 MyISAM表鎖
MySQL表級鎖的所模式
MySQL的表級鎖有兩種模式:表共享讀鎖和表獨占寫鎖
?可見,對MySIM表的讀操作,不會阻塞其他用戶對同一表的讀操作,但會阻塞對同一表的寫請求;對MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作
如何加表鎖
MyISAM在執(zhí)行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執(zhí)行更新操作(UPDATE、DELETE、INSERT等)前,會自動給設(shè)計的表加寫鎖
LOCK TABLES table_name read/write [local];- local:允許并發(fā)插入
- 在用LOCK TABLES 給表顯式加表鎖時,必須同時取得所有涉及的表,并且MySQL不支持鎖升級,也就是說,在執(zhí)行LOCK TABLES后,只能訪問顯式加鎖的這些表,不能訪問未加鎖的表;同時,如果加的是讀鎖,那么只能執(zhí)行查詢操作,而不能執(zhí)行更新操作,在自動加鎖的情況下也是如此,MyISAM總是一次獲得SQL語句所需要的全部鎖,這也是MyISAM表不會出現(xiàn)死鎖的原因
并發(fā)插入
MyISAM有一個系統(tǒng)變量 concurrent_insert,專門用以控制其并發(fā)插入行為
- 值為0時,不允許并發(fā)插入
- 值為1時,默認設(shè)置。如果MyISAM表中沒有空間(即表的中間沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄
- 值為2時,無論MyISAM表中有沒有空間,都允許在表尾并發(fā)插入記錄
MyISAM的鎖調(diào)度
20.3 事務(wù)
事務(wù)及其ACID屬性
并發(fā)處理事務(wù)帶來的問題
?事務(wù)隔離
20.4 InnoDB行鎖
行鎖模式
加鎖方式
- 共享鎖(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;
- 排他鎖(X):SELECT * FROM table_name WHERE ... FOR UPDATE;
InnnoDB行鎖實現(xiàn)方式
?Next-Key鎖
當我們用范圍條件而不是相等條件檢索數(shù)據(jù),并請求共享或排他鎖時,InnoDB會給符合條件的已有數(shù)據(jù)記錄的索引項加鎖;對于鍵值在條件范圍內(nèi)但并不存在的記錄,叫做間隙鎖,InnnoDB也會對這個“間隙”加鎖,這種鎖機制就是所謂的Next-Key鎖
20.5 InnoDB表鎖
?
總結(jié)
以上是生活随笔為你收集整理的读书笔记 —— 《深入浅出MySQL数据库开发、优化与管理维护 第2版》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面经——Linux相关
- 下一篇: 深入浅出MySQL数据库开发、优化与管理