Java隨便寫寫Mysql優化

隨便寫寫,方便記憶,可能有誤,謝指正。

一、Mysql優化

優化到最後基本都大同小異,主要取決於自己系統和服務器的實際情況。
學會查看SQL的執行計劃:執行計劃詳細見這裏

1.當只要一行數據時使用 LIMIT 1;
這樣MySQL數據庫引擎會在找到一條數據後停止搜索,不會繼續往後查少下一條符合記錄的數據。
2.創建索引
(1)普通索引:ALTER TABLE table_name ADD INDEX index_name(列名);
(2)唯一索引:ALTER TABLE table_name ADD UNIQUE INDEX index_name(列名); 
(3)組合索引:ALTER TABLE table_name ADD INDEX index_name(列名1,列名2);
(4)全文索引:ALTER TABLE table_name ADD FULLTEXT INDEX index_name(列名);
(5)空間索引:ALTER TABLE table_name ADD SPATIAL INDEX index_name(列名);
避免創建過多的索引,索引過多可能會浪費大量空間。尤其本身字段量較大的字符串,會浪費空間,且降低修改數據的速度;
所以,不要創建過多的索引,也不要創建重複的索引。

刪除索引:
(1)ALTER TABLE table_name DROP INDEX index_name;
(2)DROP INDEX index_name ON table_name;

索引使用注意事項:
要:
(1)在經常需要搜索的列上加索引,可以加快查詢速度;
(2)如果是唯一值得列,創建唯一索引會更佳,也可以確保不會出現重複數據;
(3)在where和join中出現的列需要建立索引;在表與表的連接條件上加上索引,可以加快連接查詢的速度;
(4)在經常需要排序(order by),分組(group by)和distinct 的列上加索引,可以加快排序查詢的時間(單獨 order by 用不了索引,索引考慮加where 或加limit);
(5)如果在列上創建索引,就應該將該列設置爲NOT NULL;
(6)刪除長期未使用的索引,索引並不總是最好的工具,所以要合理的使用和維護;

不要:
(1)不要在where條件語句 '=' 的左邊進行函數,運算符或表達式的計算;
如 select * from test where num+1 > 20,因爲索引不會生效(引擎會放棄使用索引,進行全表掃描)。
(2)不要使用 <>!=,not in,索引不會生效;
(3)避免對字段進行null的判斷,索引不會生效(可以用一個值代替null,如-999);
(4)使用like模糊查詢時,like '%xx%'會導致索引不生效,like 'xx%' 索引有效;如果非要'%xx%',可以使用全文索引;
(5)當表的修改(UPDATE,INSERT,DELETE)操作遠遠大於檢索(SELECT)操作時不應該創建索引,這兩個操作是互斥的關係;
(6)MySQL遵循最左前綴原理,當查詢條件匹配聯合索引的前面幾列時,可以使用聯合索引;否則,不會使用聯合索引。如果where字句中的列全都包含在索引列中,那麼where字句中的字段順序和索引順序無關,但如果是部分包括的話就要看是否滿足最左前綴匹配原則了;

3.避免 SELECT *;應該是需要什麼字段就取什麼字段;
4.固定長度的表會更快;
如果表中的所有字段都是“固定長度”的,那麼整個表會被認爲是 “static” 或 “fixed-length”。
例如,表中沒有如下類型的字段: VARCHAR,TEXT,BLOB。只要有其中任意一個字段,那麼這個表就不是“固定長度靜態表”了;所以,MySQL 引擎會用另一種方法來處理。
5.批量插入代替循環單條插入;當出現大量的操作的時候,可以採用批量處理。MySql的JDBC連接的url中要加rewriteBatchedStatements參數,並保證5.1.13以上版本的驅動,才能實現高性能的批量插入。
例如:
(1)批量修改。
(2)批量刪除。
(3)批量插入:
	例如:
		INSERT INTO table_name VALUES (1, 't1', 't11'),(2, 't2', 't22'),(3, 't3', 't33');
	如果字符串太長,則需要配置下MYSQL,在mysql 命令行中運行 :set global max_allowed_packet = 1024*1024;
	批量插入數據的效率比單數據行插入的效率高
	插入無索引的數據表比插入有索引的數據錶快一些
	較短的SQL語句的數據插入比較長的語句快

6.SQL語句中的in不應該過多。
in的參數有最大限制,不能超過999個。
7.儘量用union all 代替union。
union合併集合後會進行唯一性過濾,增加cpu運算和資源消耗。
union all少了重複過濾,所以最好是合併的數據集是沒有重複數據的。
8.儘量用union all 代替union。
union合併集合後會進行唯一性過濾,增加cpu運算和資源消耗。
union all少了重複過濾,所以最好是合併的數據集是沒有重複數據的。
9.where 子句中出現列字段的類型和傳入的參數類型不一致,會發生類型轉換,這裏最好確認好類型轉換
例如: select 1 from test num = 1;  num列是字符類型,這裏傳入數字。這裏會有隱式類型轉換。
10.儘量使用innner join(全連接),避免left join。 
inner join mysql會進行優化,會用兩個關聯表中較小的表作爲驅動表。left join則是以左邊驅動右邊的原則。
(工作中看到很多人寫sql都是left join)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章