秋招知識點總結-mysql
MySql基礎
對資料庫的操作
#建立資料庫
create database databasename charset utf8;
#刪除資料庫
drop database databasename;
#切換資料庫
use databasename;
表的操作
#新建表 create table tablename( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` )ENGINE=InnoDB DEFAULT CHARSET=utf8; ) #刪除表 drop table tablename; #插入資料 insert into talbename(field1,field2,,,) values(values1,values2...),(valuea1,valuea2,...)...; insert into tablename values(values1,values2....)....;
更新操作
update tablename set field1=newValue1,field2=newValue2...where ...;
表的刪除操作
#沒有指定條件就刪除所有的記錄,指定條件只刪除符合條件的記錄。
delete from tablename [where];
模糊查詢
select * from tablename where field1 like '%條件%';
合併查詢UNION,UNION ALL
#把兩個查詢結果拼接在一起,把第二個查詢結果放到第一個查詢結果的下面 #如果有重複資料就會刪除,而且查詢的結果格式必須是一樣的 select c_id from class where c_id=1 union select c_id from class where id =2; #UNION ALL不去重
排序order by
select c_id,shuxue,yuwen,yingyu,city,info from class,test ORder by shuxue desc,yuwen desc,c_id asc;
笛卡爾積
#直接相積,如果有相同的名稱的不進行設定會報錯,但是可以給他們取一個別名,然後通過別名呼叫他們相同的名字
select c.id,t.id,c_id,shuxue,yuwen,yingyu,city,info from class as c,test as t;
分組group by
select column_name ,function(column_name) from talbename where column_name operator value group by column_name;
查詢操作
#普通的查詢操作
select * from tablename;
select (field1,field2,field3...) from tablename;
select * from tablename where 條件;
select * from tablename where field1 like '%條件%';
## 返回一條資料
select * from tablename limit 2;
## 使用where
select * from tablename where condition1 [AND/OR] condition2...;
聯合查詢
#right join on 匹配所有符合條件的和右表的資訊
select * from class class right join child on child.id = class.c_id;
# left join on 匹配所有符合條件的和右表的資訊
select * from class class left join child on child.id = class.c_id;
# inner join 匹配所有符合條件的物件
select * from class class inner join child on child.id = class.c_id;
判斷空值
is Null 和is not Null
正則表示式匹配
SELECT name FROM person_tbl WHERE name REGEXP '^st';
修改表的結構
# 刪除,新增
alter table testtable_name drop i;
alter table testtable_name add i int;
alter table testtable_name add i int first;
alter table testtable_name add i int after c;
#修改
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
#修改表名
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
三正規化
- 第一正規化:欄位不可再分
- 第二正規化:每一行都與主鍵相關,不能只依賴主鍵的一部分
- 第三正規化:確保每列都和主鍵列直接相關,而不能間接向相關
MySQL高階
mysql資料庫引擎
mylsam
- 5.1版本之前mysql預設的引擎
- 不支援事物,行級鎖,和外來鍵
- 一種靜態的索引樹
- 增刪效率比較慢,讀取效率很快
innoDB
- 5.5版本會後預設的mysql資料引擎
- 底層使用B+樹來實現,每個飛葉子節點不存資料,葉子節點存資料,每個節點是一個page,一般為16k
TokuDB
- 插入操作快取到了最後的佇列中,插入很快,線上新增索引,不影響其他效能
- 主要用於訪問不頻繁的資料或歷史文件
Memory
堆記憶體使用存在記憶體中的表,訪問速度非常的快。但是一旦服務關閉就睡丟失
同時支援雜湊索引和B樹索引,B樹索引可以使用部分查詢和通配查詢
mysql資料庫事物
事務是訪問並更新資料庫中各種資料項的一個程式執行單元。在事務中的操作,要麼都執行修改,要麼都不執行,這就是事務的目的,也是事務模型區別於檔案系統的重要特徵之一。
事物的特性
- 原子性:整個事物要麼都完成要麼都完不成
- 一致性:在事物開始前和開始後資料庫的完整性不會被破壞
- 隔離性:一個事物是不能受其他事物的干擾的
- 永續性:事物提交後資料的修改是不可以回滾的。
隔離四個隔離等級
需要知道在寫sql語句的時候什麼情況使用什麼隔離級別
- Read UnCommitted(讀未提交)
- 解決丟失更新
- 可以讀取到另一個事物未提交的結果
- Read Committed(讀已提交)
- 可以解決髒讀,丟失更新
- 一個事務的更新操作結果只有在該事務提交之後,另一個事務才可以的讀取到同一筆資料更新後的結果。
- 大部分資料庫使用的隔離級別
- Repeatable Read(重複讀)
- 解決丟失更新,髒讀,不可重複讀
- 整個事務過程中,對同一筆資料的讀取結果是相同的,不管其他事務是否在對共享資料進行更新,也不管更新提交與否。
- MySql使用的隔離級別
- Serializable(序列化)
- 解決丟失更新,髒讀,不可重複讀,幻讀
- 所有事務操作依次順序執行。注意這會導致併發度下降,效能最差。通常會用其他併發級別加上相應的併發鎖機制來取代它。
三種錯誤型別
- 丟失更新
當A開啟事物後,B也開啟了事物,B先提交了事物,之後A出錯了把資料回滾了,就會出現丟失更新
- 髒讀
事物A讀取了事物B修改了但是還沒有提交的資料
- 不可重複讀
A事物讀取表中的資料,B事物更改了該表中的資料,並提交。A事物再次讀取的時候前後資料不一致。
- 幻讀
當A事物統計行資料的時候,B事物提交了幾行新的資料,A事物就看到了幾行新的資料。
索引
-
什麼是索引
- 排好序的快速查詢資料結構。底層使用B樹和B+樹的。
- 刪除資料的時候一般是邏輯刪除,不是物理刪除,如果物理刪除需要更改索引。
- 一般來說索引也很大,以檔案形式儲存在磁碟上。
-
優勢
- 1.提高了資料的檢索效率
- 2.提高了資料的排序效率
-
劣勢
1.實際上索引也是要佔空間的。
2.索引提高了查詢速度,但是降低了表的更新效率。
3.需要花時間研究建立最優秀的索引
mysql索引的分類
-
單值索引
- 一個索引質保函單個列,一個表可以有多個單列索引
-
唯一索引
- 索引列的值必須唯一,但允許有空值。
-
複合索引
- 一個索引包含了多個列
建立索引的基本語法
索引會影響where的條件查詢,和order by 的排序。
mysql索引結構
b樹
查詢其他的文章
hash索引
Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,所以Hash索引的查詢效率要遠高於B-Tree索引。
Hash索引本身由於其特殊性也帶來了很多限制和弊端,主要有以下這些:
- Hash索引僅僅能滿足"=",“IN"和”<=>"查詢,不能使用範圍查詢。雜湊索引只支援等值比較查詢,包括=、 IN 、<=> (注意<>和<=>是不同的操作)。 也不支援任何範圍查詢,例如WHERE price > 100。
由於Hash索引比較的是進行Hash運算之後的Hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的Hash演算法處理之後的Hash值的大小關係,並不能保證和Hash運算前完全一樣。 - Hash索引無法被用來避免資料的排序操作。
由於Hash索引中存放的是經過Hash計算之後的Hash值,而且Hash值的大小關係並不一定和Hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算; - Hash索引不能利用部分索引鍵查詢。
對於組合索引,Hash索引在計算Hash值的時候是組合索引鍵合併後再一起計算Hash值,而不是單獨計算Hash值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash索引也無法被利用。 - Hash索引在任何時候都不能避免表掃描。
前面已經知道,Hash索引是將索引鍵通過Hash運算之後,將 Hash運算結果的Hash值和所對應的行指標資訊存放於一個Hash表中,由於不同索引鍵存在相同Hash值,所以即使取滿足某個Hash鍵值的資料的記錄條數,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。 - Hash索引遇到大量Hash值相等的情況後效能並不一定就會比BTree索引高。
對於選擇性比較低的索引鍵,如果建立Hash索引,那麼將會存在大量記錄指標資訊存於同一個Hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。
full-text全文索引
需要查詢其他
R-Tree索引
需要查詢其他文章
索引的建立規則
-
1.主鍵自動建立唯一索引
-
2 .頻繁查詢作為查詢條件的欄位應該建立索引
-
3.查詢中與其他表關聯的欄位,外來鍵關係建立索引
-
4.頻繁更新的欄位不適合建立索引。
-
5.where條件裡用不到的欄位不用建立索引
-
6.儘量使用複核索引
-
7.查詢中排序的欄位,排序欄位若通過索引去訪問將大大提高排序速度
-
8.查詢中統計或者分組欄位。
那些情況不要建立索引
-
1.表記錄太少了
-
2.經常增刪改的表不建立
-
3.如果某個列包含了太多了重複的內容。
效能分析
mysql query optimizer
mysql的常見瓶頸
Explain
1.是什麼
使用explain關鍵字可以模擬優化器執行sql查詢語句,從而指導mysql如何處理你的sql語句的,分析你的查詢語句或是表結構的效能瓶頸
2.能做一些什麼
- 表的讀取順序
- 資料讀取操作的操作型別
- 那些索引可以使用
- 那些索引可以被實際使用
- 表之間的引用
- 每張表有多少航被優化器查詢
3.怎麼用
explain + sql
包含資訊:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1、id
id相同:執行順序自上而下。
id不同:id值越大的越先執行,drived2表示從id=2的表中衍生出來的
2、select_type
有六個常見值
各個值對應的資料:
3、table
表示當前資料是哪張表的。
4、type
從最好到最壞依次是
system>const>eq_ref>ref>range>index>All
const(通過索引一次就找到了,const用於比較primary key或者unique索引,因為只匹配了一行資料,所以很快,如將主鍵置於wherer列表中,mysql就能將該查詢轉化為一個常量),system
eq_ref (唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或唯一索引掃描)
ref
range
index
5、possible_keys ,key
決定是否使用到了索引,是否索引失效,多個索引競爭的時候最終使用的是哪個索引
6、key_len
7、ref
8、rows
9、Extra
包含不在其他列中顯示但是非常重要的額外資訊
using filesort
建立好索引之後,但是沒有使用到索引,系統按照自己的方式重新排序了
using temporary
新建了一個內部的臨時表用來存放臨時結果,常見於order by 和 group by
using index
這個是好事情。
using where
使用了 where
impossible where
輸入的條件錯誤
索引優化
索引分析
使用explain+ sql語句進行分析
索引失效
建立了索引但是索引沒有用上,索引就失效了。
1.全值匹配:所有值全都有,的索引是不會是小的。
2.最佳左匹配法則: 從最左開始建立的欄位不能丟失,不跳過索引的中間列
3.不要再所以上做任何操作,會導致索引失效轉向全表掃描。不能使用各種函式
4.不能使用範圍查詢之後的索引。
5.儘量使用覆蓋索引
6.mysql在使用不等於的時候無法使用索引會導致全表掃描
7.is null , is not null 也無法使用索引
8.like 以萬用字元 %開始會讓索引失效(如果一定要左邊加%那就使用覆蓋索引來解決問題)
9.字串不加引號會讓索引失效
10.使用or來連線的時候會使索引失效
總結
帶頭大哥不能死,中間兄弟不能斷。索引類上不計算,like百分加右邊,範圍之後全失效,字串裡有引號