滴水穿石(Mysql知識)

  1. MYISAM 引擎和INNODB引擎 各自的適用業務場景都有那些:
    • MYISAM不支持事務,所以它適用的場景集中在檢索領域
    • MyISAM可被壓縮,存儲空間較小 InnoDB的表需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引
    • MYISAM不支持事務,InnoDB支持
    • MYISAM鎖的級別為表鎖,InnoDB是行級別的鎖,InnoDB通過一個聚合索引對行數據進行加鎖,行級鎖通聚合索引對數據行進行鎖定,聚合索引一般是建立在主鍵上的,所以可以保證數據唯一性
    • count without where 時,也就是對表進行統計時,MYISAM的性能更優,因為MYISAM將信息保存到了表中,而InnoDB需要進行全表的掃描

綜上,我個人的總結: 在進行讀寫分離時,可以將讀的庫的存儲引擎設置為MYISAM,將寫的庫設置為InnoDB

  1. 為什么這幾個SQL查詢的結果集不同
  • <>和 != 是對值進行的判定,但是NULL不是一種“值”,NULL的含義是指的這個列所指定的行值是不是為空存放的空間是不是為空。所以在平時判定一個列的null值是一般是用 is null 或者 is not null
  SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
  SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
  SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
  1. 查詢時是否使用了索引和查詢的時候是否掃描全表并不是完全相關聯的,查詢條件中使用了不等于操作符(<>、!=)的select語句執行慢解決方法:通過把不等于操作符改成or,可以使用索引,避免全表掃描。例如,把column<>’aaa’,改成column<’aaa’ or column>’aaa’,就可以使用索引了。

  2. 會導致全表掃描的幾種情況

  3. 利用profiling 對sql語句進行解剖

    1. 利用set profiling = 1 打開開關
    2. 利用 SHOW PROFILES 查看語句的query_id
    3. 利用下面的語句對sql語句進行分析

在ICP之前,Mysql在復合索引中,第一列是范圍查詢,第二列通常是無法使用索引的,建議第一列是=,<=>,is null。而在ICP出來之后,就沒有了這個限制。

SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type:
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS

不要將table的主鍵設置的過長,如果過長的話會導致二級索引所占磁盤空間很大

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容