今天,資料庫的操作越來越成為整個應用的性能瓶頸了,這點對于 Web 應用尤其明顯,關于資料庫的性能,這并不只是 DBA 才需要擔心的事,而這更是我們程式員需要去關注的事情,當我們去設計資料庫表結構,對操作資料庫時(尤其是查表時的 SQL 陳述句),我們都需要注意資料操作的性能,
為查詢快取優化你的查詢
大多數的 MySQL 服務器都開啟了查詢快取,這是提高性最有效的方法之一,而且這是被 MySQL 的資料庫引擎處理的,當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個快取中,這樣,后續的相同的查詢就不用操作表而直接訪問快取結果了,
這里最主要的問題是,對于程式員來說,這個事情是很容易被忽略的,因為,我們某些查詢陳述句會讓 MySQL 不使用快取,請看下面的示例:
上面兩條 SQL 陳述句的差別就是 CURDATE() ,MySQL 的查詢快取對這個函式不起作用,所以,像 NOW() 和 RAND() 或是其它的諸如此類的 SQL 函式都不會開啟查詢快取,因為這些函式的回傳是會不定的易變的,所以,你所需要的就是用一個變數來代替 MySQL 的函式,從而開啟快取,
EXPLAIN 你的 SELECT 查詢
使用 EXPLAIN 關鍵字可以讓你知道 MySQL 是如何處理你的 SQL 陳述句的,這可以幫你分析你的查詢陳述句或是表結構的性能瓶頸,
EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的資料表是如何被搜索和排序的……等等,等等,
挑一個你的 SELECT 陳述句(推薦挑選那個最復雜的,有多表聯接的),把關鍵字 EXPLAIN 加到前面,你可以使用 phpmyadmin 來做這個事,然后,你會看到一張表格,下面的這個示例中,我們忘記加上了 group_id 索引,并且有表聯接:

當我們為 group_id 欄位加上索引后:

我們可以看到,前一個結果顯示搜索了 7883 行,而后一個只是搜索了兩個表的 9 和 16 行,查看 rows 列可以讓我們找到潛在的性能問題,
當只要一行資料時使用 LIMIT 1 1
當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去 fetch 游標,或是你也許會去檢查回傳的記錄數,
在這種情況下,加上 LIMIT 1 可以增加性能,這樣一樣,MySQL 資料庫引擎會在找到一條資料后停止搜索,而不是繼續往后查少下一條符合記錄的資料,
下面的示例,只是為了找一下是否有“中國”的用戶,很明顯,后面的會比前面的更有效率,(請注意,第一條中是 Select *,第二條是 Select 1)

為搜索欄位建索引
索引并不一定就是給主鍵或是唯一的欄位,如果在你的表中,有某個欄位你總要會經常用來做搜索,那么,請為其建立索引吧,

從上圖你可以看到那個搜索字串 “last_name LIKE ‘a%’”,一個是建了索引,一個是沒有索引,性能差了 4 倍左右,
另外,你應該也需要知道什么樣的搜索是不能使用正常的索引的,例如,當你需要在一篇大的文章中搜索一個詞時,如: “WHERE post_content LIKE‘%apple%’”,索引可能是沒有意義的,你可能需要使用 MySQL 全文索引 或是自己做一個索引(比如說:搜索關鍵詞或是 Tag 什么的)
在 Join 表的時候使用相當型別的例,并將其索引
如果你的應用程式有很多 JOIN 查詢,你應該確認兩個表中 Join 的欄位是被建過索引的,這樣,MySQL 內部會啟動為你優化 Join 的 SQL 陳述句的機制,
而且,這些被用來 Join 的欄位,應該是相同的型別的,例如:如果你要把DECIMAL 欄位和一個 INT 欄位 Join 在一起,MySQL 就無法使用它們的索引,對于那些 STRING 型別,還需要有相同的字符集才行,(兩個表的字符集有可能不一樣)

最后
針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經,希望可以幫助到大家,
有需要的小伙伴可以加群1149778920 暗號:qf


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/197025.html
標籤:java
