1. 程式人生 > 資料庫 >秋招知識點總結-mysql

秋招知識點總結-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索引本身由於其特殊性也帶來了很多限制和弊端,主要有以下這些:

  1. Hash索引僅僅能滿足"=",“IN"和”<=>"查詢,不能使用範圍查詢。雜湊索引只支援等值比較查詢,包括=、 IN 、<=> (注意<>和<=>是不同的操作)。 也不支援任何範圍查詢,例如WHERE price > 100。  
    由於Hash索引比較的是進行Hash運算之後的Hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的Hash演算法處理之後的Hash值的大小關係,並不能保證和Hash運算前完全一樣。
  2. Hash索引無法被用來避免資料的排序操作。  
    由於Hash索引中存放的是經過Hash計算之後的Hash值,而且Hash值的大小關係並不一定和Hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;
  3. Hash索引不能利用部分索引鍵查詢。  
    對於組合索引,Hash索引在計算Hash值的時候是組合索引鍵合併後再一起計算Hash值,而不是單獨計算Hash值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,Hash索引也無法被利用。
  4. Hash索引在任何時候都不能避免表掃描。  
    前面已經知道,Hash索引是將索引鍵通過Hash運算之後,將 Hash運算結果的Hash值和所對應的行指標資訊存放於一個Hash表中,由於不同索引鍵存在相同Hash值,所以即使取滿足某個Hash鍵值的資料的記錄條數,也無法從Hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。
  5. 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

包含資訊:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
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百分加右邊,範圍之後全失效,字串裡有引號