MySql基礎知識點

常用的sql語句

條件查詢、關聯查詢、排序查詢、分組查詢、邏輯關鍵字、函數

常用的數據類型

整數型和浮點數

類型 大小 用途
TINYINT 1 字節,8位 小整數值
SMALLINT 2 字節,2*8位 大整數值
MEDIUMINT 3 字節,3*8位 大整數值
INT或INTEGER 4 字節,4*8位 大整數值
BIGINT 8 字節,8*8位 極大整數值
FLOAT 4 字節,4*8位 單精度
浮點數值
DOUBLE 8 字節,8*8位 雙精度
浮點數值
DECIMAL 對DECIMAL(M,D) ,如果M>D,爲M+2否則爲D+2 小數值

日期和時間類型

表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。

TIMESTAMP類型有專有的自動更新特性,將在後面描述。

類型 大小
(字節)
格式 用途
DATE 3 YYYY-MM-DD 日期值
TIME 3 HH:MM:SS 時間值或持續時間
YEAR 1 YYYY 年份值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

字符串類型

字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工作以及如何在查詢中使用這些類型。

類型 大小 用途
CHAR 0-255字節 定長字符串
VARCHAR 0-65535 字節 變長字符串
TINYBLOB 0-255字節 不超過 255 個字符的二進制字符串
TINYTEXT 0-255字節 短文本字符串
BLOB 0-65 535字節 二進制形式的長文本數據
TEXT 0-65 535字節 長文本數據
MEDIUMBLOB 0-16 777 215字節 二進制形式的中等長度文本數據
MEDIUMTEXT 0-16 777 215字節 中等長度文本數據
LONGBLOB 0-4 294 967 295字節 二進制形式的極大文本數據
LONGTEXT 0-4 294 967 295字節 極大文本數據

CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換

BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值值

BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。

有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。

MySql存儲引擎

MyIASM

  • 優點:支持全文檢索(InnoDB在版本5.6之後也支持了),查詢效率高
  • 缺點:不支持事務,使用表級鎖。
    MyISAM的表鎖有讀鎖和寫鎖(兩個鎖都是表級別):表共享讀鎖和表獨佔寫鎖。在對MyISAM表進行讀操作時,不會阻塞其他用戶對同一張表的讀請求,但是會阻塞其他用戶對錶的寫請求;對其進行寫操作時會阻塞對同一表讀操作和寫操作,MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操作是串行的。那麼,一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先獲得鎖。不僅如此,即使讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求之前!這是因爲MySQL認爲寫請求一般比讀請求要重要。這也正是MyISAM表不太適合於有大量更新操作和查詢操作應用的原因,因爲,大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。這種情況有時可能會變得非常糟糕! 

InnoDB(5.5版本之後的默認引擎)

  • 優點:支持ACID事務,支持外鍵,支持行級鎖提高了併發效率

MySql中的鎖

  • 表鎖:開銷小,加鎖快,不會出現死鎖,但鎖的力度比較大,發生鎖衝突的概率高,因此併發訪問效率低
  • 行鎖:開銷大,加鎖慢,有可能出現死鎖,但鎖的力度比較小,發生鎖衝突的概率比較低,因此併發訪問效率高
  • 共享鎖(讀鎖):如果一個事務已經佔有鎖,那麼其他的事務可以讀但不能寫,可以使用SELECT ... LOCK IN SHARE MODE 顯式加共享鎖,如:SELECT * FROM tb_user WHERE user_id=1 LOCK IN SHARE MODE;
  • 排他鎖(寫鎖):如果一個事務已經佔有鎖,那麼其他的事務不能讀也不能寫,對於update,insert,delete語句innodb會自動給涉及的數據集加上排他鎖,可以使用SELECT ... FOR UPDATE 顯式加排他鎖,如:SELECT * FROM tb_user WHERE user_id=1 FOR SHARE

MySql中的索引

索引可以大幅增加數據庫的查詢性能。但是使用索引也是有代價的:

  1. 需要額外的磁盤空間保存索引。
  2. 對插入更新刪除等操作,由於更新索引會增加額外的開銷

因此索引比較適合用在讀多寫少的場景。

類型

  • 唯一索引:保證索引列中的值是唯一的,允許出現空值
  • 主鍵索引:是一種特殊的唯一索引,不允許出現空值
  • 普通索引:與唯一索引不同,允許索引列中存在相同的值
  • 聯合索引:由多個列共同組成的索引,應用聯合索引時要注意最左原則,即:WHERE查詢條件中的字段必須與索引字段從左至右依次匹配,如果查詢條件中沒有用到聯合索引的第一個字段,那麼聯合索引是不會生效的
  • 全文索引:只能在char,verchar,text類型上使用,底層使用倒排索引實現,要注意對於大數據量的表生成全文索引非常消耗時間也非常消耗磁盤空間

實現

  • B-Tree:比較適合用作大於或小於這樣的範圍查詢,是MySql最常使用的一種索引實現
  • R-Tree:用於處理多維數據的數據結構,可以對地理數據進行空間索引,實際業務中使用較少
  • Hash:使用散列表來對數據進行索引,Hash方式不會像B-Tree那樣需要查詢多次才能定位到記錄,因此Hash索引的效率比B-Tree高,但是不支持範圍查找、排序等功能,實際使用也較少
  • FullText:全文索引,是一種記錄關鍵字與對應文檔關係的一種倒排索引

MySql調優

開發人員主要掌握:

  1. 可以從表結構和索引進行優化
  2. 可以從sql進行優化
  3. 從MySql參數優化(簡單瞭解)

表結構與索引優化原則

  • 在設計表結構時,要考慮到數據庫的擴展能力和數據量和讀寫量的增長,規劃好分庫分表方案,讀寫分離方案
  • 爲字段選擇合適的數據類型,在滿足業務邏輯的條件下優先選用佔用空間小的數據類型。
  • 將字段多的表分解成多個表,必要時增加中間表進行關聯
  • 可以輕量的反範式,適當的增加冗餘字段,可以避免關聯查詢提高查詢效率
  • 爲查詢創建必要索引,創建索引時要謹慎考慮,避免濫用,畢竟索引的使用也是有代價的
  • 列字段儘量設置爲NOT NULL 不允許空值,使用了NULL的列很難進行查詢優化,允許NULL會使索引,索引統計更加複雜,允許NULL的列需要更多的存儲空間,還需要MySql內部進行特殊處理,因此,具體字段建議設置一個狀態值代表NULL

sql優化

  • 分析慢查詢日誌,尋找最需要優化的語句
  • 利用分析工具:explain、profile 查看執行計劃
  • 儘量在有索引的字段上進行排序操作
  • 優化sql語句這裏

存儲過程與函數

  1. 存儲過程一般獨立的來執行,而函數往往是作爲其他SQL語句的一部分來調用
  2. sql語句中不能使用存儲過程,但可以使用函數
  3. 存儲過程說白了就是把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要的時候從數據庫中直接調用,省去了編譯的過程. 提高了運行速度,因此,存儲過程會降低程序的可移植性,因此要謹慎使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章