1. 程式人生 > >MySQL筆記隨記

MySQL筆記隨記


文章目錄

SQL操作

  • 使用集合查詢時可以with rollup對不同的group進行統計求和
  • 使用mysql < xxx.sql可以匯入指令碼,或使用source xxx.sql直接執行;反之mysql > xxx.sql可以匯出資料庫相關資訊,具體引數另參考
  • 使用load data local infile <檔案路徑名,如'member.txt'> into table member
    將資料直接插入表
  • 不使用排序直接選擇出來的記錄不一定就是按照插入表的順序的;null值升序在前,降序在後
  • create table xxx like b建立b的副本;create table xxx select ...可以直接建立
  • alter table dba.a rename to dbb.b將完成資料表的移動

規則

  • MySQL支援數字開頭的識別符號,一般用反引號加以區別,其他如帶有空格、連線符、保留字的也建議如此;另外,作業系統可能在儲存資料庫或表名的時候,會有一些限制;某些SQL模式可能會對這些有限制要求,要注意
  • 大部分識別符號的最大長度為64字元,別名較長為256個字元;

索引

不同的引擎支援不同的索引,如InnoDB就不支援hash索引;Unique索引可以存在Null值,且允許多個null(因為任意兩個null是無法進行比較的)

全文檢索Fulltext

全文搜尋,在不適用模板匹配操作的情況下進行單詞或短語的查詢。3種類型

  • 自然語言搜尋(預設)。MySQL會將搜尋字串解析成一系列的單詞,然後搜尋出包含這些單詞的行
  • 布林模式搜尋。搜尋字串可以包含修飾符,來表明特定需要。
  • 查詢拓展搜尋。這種搜尋分兩個階段,第一階段是自然語言搜尋。第二階段把原來的搜尋字串,與在第一階段的搜尋裡高度匹配的行連線在一起,再進行一次搜尋。
  • 全文搜尋必須事先建立一個特殊索引,其基於fulltext索引;全文索引將會忽略掉那些常見詞;一些內建詞如“the”、“after”等和太短——少於4個字元會被忽略。可以為單個或多個列建立索引
  • select * from student where match(sname) against('Tom') 全文搜尋中,將按照match的相關程度來進行操作。可在against中根據in natural language mode\in boolean mode\with query expansion來進行不同檢索型別的選擇。

索引參考意見

  • 在需要搜尋、排序、分組的列上建立索引;最佳候選列應該是where、order_by、group_by的或連線子句中的列
  • 在資料列基數較大的列上,如性別就不適合
  • 索引短小的值
  • 索引字串字首
  • 利用最左字首
  • 不要建立過多索引
  • 參與比較的索引型別保持匹配;即索引列和索引型別
  • 利用慢查詢日誌找出那些效能低劣的查詢

引擎

  • 引擎原為“表處理器”,儲存引擎。每一種儲存引擎所實現的表具有一組特定的屬性。主要有InnoDB、MyISAM、ARCHIVE、CSV等,前兩者比較常見。

  • ARCHIVE引擎,是用於資料存檔的引擎,表現為資料行被插入後就不能再修改了;CSV引擎在進行資料儲存時,會以逗號作為資料項間的分隔符。

  • 引擎從編譯在系統內部,逐漸變更為可外掛載入化、介面化;show ENGINES\G 或 select engine from information_schema.engines

  • 不同的引擎在建立表時會建立一些不同的檔案,儲存資料、索引等;建立表MySQL會在磁碟中建立一個同名的.frm檔案

  • InnoDB引擎是MySQL的預設引擎。具有功能:

    • 表在提交執行和回滾操作時是事務安全的;可以通過建立儲存點savepoint實現部分回滾
    • 系統崩潰後可以自動恢復
    • 外來鍵和引用完整性支援,包括級聯刪除和更新
    • 基於行級別的鎖定和多版本化,良好的併發效能
    • V5.6開始支援全文索引和fulltext索引

    預設會把表集中儲存在一個系統表空間裡,而不是為不同表建立不同檔案;

  • MyISAM引擎:

    • 儲存連續相似字串索引值會對鍵進行壓縮,也可以壓縮相似的數字索引值;
    • 支援全文檢索和fulltext索引
    • 支援空間資料檢索和spatial索引

服務

  • 建立資料表預設引擎Engine=InnoDB;該引擎預設使用小寫字母儲存資料庫和表名。
  • 一般預設下,Windows和mac OS系統的MySQL不會區分大小寫(SQL的關鍵字、函式名等應不區分,而資料庫、表、檢視名等依賴作業系統的檔案環境);而Unix系統可能會區分。這些都可以設定; 同樣,儲存過程、儲存函式和事件名不區分大小寫;觸發器區分大小寫;別名區分大小寫,列名、索引名不區分大小寫。
  • 伺服器的SQL模式,是一個系統變數,用來控制一些限制和操作;SQL模式可以全域性設定,也可以在不同客戶端修改。SQL模式是一些常量列舉值的集合。如set GLOBAL sql_mode='TRADITIONAL'沒有global則為會話的臨時SQL模式。可以使用select查詢:select @@session/global.sql_mode

查詢優化

Explain命令、analyze table 命令:

  • 舉個例子:explain select * from student where false[\G];\G 豎行顯示
  • 查詢優化的主要目標其實是儘可能使用索引。

意見:

  • 對錶進行分析;生成關於鍵值分佈情況的統計資料,可以幫助優化程式更準確地評估索引效率;表的分析應該在表的資料有更新情況下週期性地進行
  • 使用explain進行分析,驗證優化程式的操作;可以用來查詢增加索引對於查詢是否有優化作用時
  • 必要時給予優化程式提示或改寫;straight_join命令
  • 比較擁有相同資料型別的列;在比較中儘量比較資料型別一致的類,避免因資料精度縮放帶來的時間損耗
  • 讓索引列在比較表示式中單獨出現;儘量將表示式或者函式呼叫的列單獨處理,因為對列進行表示式計算處理時,MySQL將不會再使用索引
  • 不要再Like模式的開始位置就使用萬用字元
  • 多次測試不同的查詢方法,選擇較優的一個
  • 避免過多使用自動型別轉換

選擇利於高效查詢的資料型別

  • 多用數字運算,少用字串運算
  • 較小資料型別夠用則不用大的資料型別
  • 資料列儘量宣告為not null的

選擇利於高效查詢的表的儲存格式:
高效載入資料:1)批量載入效率大於單行,如load data 和insert;2)load data 在沒有local情況下效率更高;3)insert中values 後接多個元組與多次insert相比效率更高,總體耗時更短、需要索引的重新整理次數更少。