1. 程式人生 > 實用技巧 >Java 獲取小程式openid(基於SpringBoot)

Java 獲取小程式openid(基於SpringBoot)

技術標籤:mysqlmysql資料庫

1.大批量插入資料

當使用load命令匯入資料的時候,適當的設定可以提高匯入的效率

  • 主鍵順序插入:因為InnoDB型別的表是按照主鍵的順序儲存的,所以將匯入的資料按照主鍵的順序排列,可以有效的提高匯入資料的效率。如果InnoDB表沒有主鍵,那麼系統會自動預設建立一個內部列作為主鍵,所以如果可以給表建立一個主鍵,將可以利用這點,來提高匯入資料的效率。

  • 關閉唯一性檢驗:在匯入資料前執行 SET UNIQUE_CHECKS=0,關閉唯一性校驗,在匯入結束後執行SET UNIQUE_CHECKS=1,恢復唯一性校驗,可以提高匯入的效率。

唯一性校驗:針對unique欄位進行校驗,用來保證每個記錄都有一個唯一的標識,使得該列上沒有重複的值

  • 手動提交事務:如果應用使用自動提交的方式,建議在匯入前執行 SET AUTOCOMMIT=0,關閉自動提交,匯入結束後再執行 SETAUTOCOMMIT=1,開啟自動提交,也可以提高匯入的效率。

如果不設定手動提交事務,那麼預設每條插入語句都是一個事務,每次都要提交事務。設定手動提交事務的話,可以在迴圈前開啟事務,迴圈結束後再提交事務,只需要提交一次事務。

2.優化insert語句

  • 如果需要同時對一張表插入很多行資料時,應該儘量使用多個值表的insert語句,這種方式將大大的縮減客戶端與資料庫之間的連線、關閉等消耗。使得效率比分開執行的單個insert語句快。
  • 在事務中進行資料插入
  • 資料有序插入

3.優化order by語句

mysql中兩種排序方式:

  • 通過對返回資料進行排序,也就是通常說的 filesort 排序,所有不是通過索引直接返回排序結果的排序都叫 FileSort 排序
  • 通過有序索引順序掃描直接返回有序資料,這種情況即為 using index,不需要額外排序,操作效率高

瞭解了MySQL的排序方式,優化目標就清晰了:儘量減少額外的排序,通過索引直接返回有序資料。where 條件和Order by 使用相同的索引,並且Order By 的順序和索引順序相同, 並且Order by 的欄位都是升序,或者都是降序。否則肯定需要額外的操作,這樣就會出現FileSort。

4.優化filrsort

通過建立合適的索引,能夠減少 Filesort 的出現,但是在某些情況下,條件限制不能讓Filesort消失,那就需要加快 Filesort的排序操作。對於Filesort , MySQL 有兩種排序演算法:

1) 兩次掃描演算法 :MySQL4.1 之前,使用該方式排序。首先根據條件取出排序欄位和行指標資訊,然後在排序區sort buffer 中排序,如果sort buffer不夠,則在臨時表 temporary table 中儲存排序結果。完成排序之後,再根據行指標回表讀取記錄,該操作可能會導致大量隨機I/O操作。

2)一次掃描演算法:一次性取出滿足條件的所有欄位,然後在排序區 sort buffer 中排序後直接輸出結果集。排序時記憶體開銷較大,但是排序效率比兩次掃描演算法要高。

MySQL 通過比較系統變數 max_length_for_sort_data 的大小和Query語句取出的欄位總大小, 來判定是否那種排序演算法,如果max_length_for_sort_data 更大,那麼使用第二種優化之後的演算法;否則使用第一種。可以適當提高 sort_buffer_size 和 max_length_for_sort_data 系統變數,來增大排序區的大小,提高排序的效率。

5.優化group by語句

由於GROUP BY 實際上也同樣會進行排序操作,而且與ORDER BY 相比,GROUP BY 主要只是多了排序之後的分組操作。當然,如果在分組的時候還使用了其他的一些聚合函式,那麼還需要一些聚合函式的計算。所以,在GROUP BY 的實現過程中,與 ORDER BY 一樣也可以利用到索引。

1.如果查詢包含 group by 但是使用者想要避免排序結果的消耗, 則可以執行order by null 禁止排序。如:

select age,count(*) from emp group by age;

select age,count(*) from emp group by 1 age order by null;

2.可以使用索引來優化Group by語句

6.優化巢狀查詢(子查詢)

使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,並且寫起來也很容易。但是,有些情況下,子查詢是可以被更高效的連線(JOIN)替代。例如:查詢有角色的所有使用者資訊:

select * from t_user where id in (select user_id from user_role );

優化後:

select * from t_user u , user_role ur where u.id = ur.user_id;

連線(Join)查詢之所以更有效率一些 ,是因為MySQL不需要在記憶體中建立臨時表來完成這個邏輯上需要兩個步驟的查詢工作。

7.優化OR條件

對於包含OR的查詢子句,如果要利用索引,則OR之間的每個條件列都必須用到索引 , 而且不能使用到複合索引; 如果沒有索引,則應該考慮增加索引。

結果值從好到壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge >unique_subquery > index_subquery > range > index > ALL

UNION 語句的 type 值為 ref,OR 語句的 type 值為 range,可以看到這是一個很明顯的差距UNION 語句的 ref 值為 const,OR 語句的 type 值為 null,const 表示是常量值引用,非常快這兩項的差距就說明了 UNION 要優於 OR 。

優化前:EXPLAIN SELECT * FROM testjson WHERE month='4month' or score='80'

優化後:EXPLAIN SELECT * FROM testjson WHERE month='4month' UNION SELECT * FROM testjson WHERE score='80'

8.優化分頁查詢

一般分頁查詢時,通過建立覆蓋索引能夠比較好地提高效能。一個常見又非常頭疼的問題就是 limit 2000000,10 ,此時需要MySQL排序前2000010 記錄,僅僅返回2000000 - 2000010 的記錄,其他記錄丟棄,查詢排序的代價非常大 。例如:

select * from tb limit 2000000,10;

優化思路一:在索引上完成排序分頁操作,最後根據主鍵關聯回原表查詢所需要的其他列內容。

select * from tb ,(select id from tb order by id limit 2000000,10) a where tb.id=a.id;

優化思路二:該方案適用於主鍵自增的表,可以把Limit 查詢轉換成某個位置的查詢 。(限制:不可出現斷層,必須為主鍵自增的列)

select * from tb where id>1000000 limit 10

9.使用sql提示

一般用在from之後,where之前。例如:select * from tb force index(name) where name='張三'

  1. use index:在查詢語句中表名的後面,新增 use index 來提供希望MySQL去參考的索引列表,就可以讓MySQL不再考慮其他可用的索引。
  2. ingore index:如果使用者只是單純的想讓MySQL忽略一個或者多個索引,則可以使用 ignore index
  3. force index:為強制MySQL使用一個特定的索引,可在查詢中使用 force index