一、mysql inner join為什么不走索引
因為索引的優勢是在大表中過濾出小的結果集進行聯接,mysql inner join句根本沒有任何過濾條件。另外表很小的話全表掃描比索引快。針對查詢語句過慢的問題,首先使用explain關鍵字對sql的執行計劃進行分析。發現整個查詢過程中均沒有使用索引,每個表的數據不大,但是三張表聯合,數據量直接乘積量級了;
既然定位到索引問題,就去數據庫查看表的索引信息,卻發現相關字段已經建立了索引,但是查詢過程中卻未使用到索引;
使用左外連接時,數據庫會以左表為驅動,右表被驅動,考慮使用inner join替換left join來觀察數據庫查詢是否會進行優化,替換后使用explain發現retailer表作為了被驅動表,且使用了索引,但是customer兩個表仍然未走索引,且耗時過長;
經過對關聯表的結構進行深入對比,且對字段類型、長度、編碼等信息對比后發現數據表的編碼方式存在差異,retailer表中字段字符集格式為utf8mb4,而customer表中字符集格式為utf8;
將關聯字段字符集統一后,使用left join左外連接仍然可以很好的命中索引,查詢時間直接0.1s。
延伸閱讀:
二、InnoDB是什么
InnoDB 是 MySQL 上名列前茅個提供外鍵約束的數據存儲引擎,除了提供事務處理外,InnoDB 還支持行鎖,提供和 Oracle 一樣的一致性的不加鎖讀取,能增加并發讀的用戶數量并提高性能,不會增加鎖的數量。InnoDB 的設計目標是處理大容量數據時最大化性能,它的 CPU 利用率是其他所有基于磁盤的關系數據庫引擎中最有效率的。
InnoDB 是一套放在 MySQL 后臺的完整數據庫系統,InnoDB 有它自己的緩沖池,能緩沖數據和索引,InnoDB 還把數據和索引存放在表空間里面,可能包含好幾個文件,這和 MyISAM 表完全不同,在 MyISAM 中,表被存放在單獨的文件中,InnoDB 表的大小只受限于操作系統文件的大小,一般為 2GB。