亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何優化MySQL?

發布時間:2020-05-15 16:19:56 來源:億速云 閱讀:245 作者:Leah 欄目:MySQL數據庫

如何優化MySQL?針對這個問題,今天小編總結這篇有關MySQL優化的文章,希望幫助更多想學習MySQL優化的同學找到更加簡單易行的辦法。

1. 選取最適用的字段屬性

表中字段的寬度設得盡可能小:char 的上限為 255 字節(固定占用空間),varchar 的上限 65535 字節(實際占用空間),text 的上限為 65535。char 比 varchar 處理效率高。

盡量把字段設置為 NOT NULL,執行查詢的時候,數據庫不用去比較 NULL 值。

2. 使用連接(JOIN)來代替子查詢 (Sub-Queries)

連接(JOIN)之所以更有效率一些,是因為 MySQL 不需要在內存中創建臨時表來完成這個邏輯上的需要兩個步驟的查詢工作(聯合查詢的條件加索引更快)。

3. 使用聯合 (UNION) 來代替手動創建的臨時表

把需要使用臨時表的兩條或更多的 SELECT 查詢合并的一個查詢中。

SELECT Name, Phone FROM client UNION SELECT Name, BirthDate FROM author  UNION SELECT Name, Supplier FROM product;

4. 事務

盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯合(UNION)來創建各種各樣的查詢,但不是所有的數據庫操作都可以只用一條或少數幾條 SQL 語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。

作用是:要么語句塊中每條語句都操作成功,要么都失敗。換句話說,就是可以保持數據庫中數據的一致性和完整性。事物以 BEGIN 關鍵字開始,COMMIT 關鍵字結束。在這之間的一條 SQL 操作失敗,那么,ROLLBACK 命令就可以把數據庫恢復到 BEGIN 開始之前的狀態。

5. 鎖定表

盡管事務是維護數據庫完整性的一個非常好的方法,但卻因為它的獨占性,有時會影響數據庫的性能,尤其是在很大的應用系統中。由于在事務執行的過程中,數據庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。

LOCK TABLE inventory WRITE 
SELECT Quantity FROM inventory 
WHEREItem='book'; 
... 
UPDATE inventory SET Quantity=11 
WHEREItem='book'; 
UNLOCK TABLES

這里,我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作。

6、使用外鍵

鎖定表的方法可以維護數據的完整性,但是它卻不能保證數據的關聯性。這個時候我們就可以使用外鍵。例如,外鍵可以保證每一條銷售記錄都指向某一個存在的客戶。在這里,外鍵可以把 customerinfo 表中的 CustomerID 映射到 salesinfo 表中 CustomerID,任何一條沒有合法 CustomerID 的記錄都不會被更新或插入到 salesinfo 中。

CREATE TABLE customerinfo 
( 
CustomerID INT NOT NULL , 
PRIMARY KEY ( CustomerID ) 
) TYPE = INNODB; 
CREATE TABLE salesinfo 
( 
SalesID INT NOT NULL, 
CustomerID INT NOT NULL, 
PRIMARY KEY(CustomerID, SalesID), 
FOREIGN KEY (CustomerID) REFERENCES customerinfo 
(CustomerID) ON DELETECASCADE 
) TYPE = INNODB;

注意例子中的參數 “ON DELETE CASCADE”。該參數保證當 customerinfo 表中的一條客戶記錄被刪除的時候,salesinfo 表中所有與該客戶相關的記錄也會被自動刪除。如果要在 MySQL 中使用外鍵,一定要記住在創建表的時候將表的類型定義為事務安全表 InnoDB 類型。該類型不是 MySQL 表的默認類型。定義的方法是在 CREATE TABLE 語句中加上 TYPE=INNODB。

7. 使用索引

查詢語句當中包含有 MAX (), MIN () 和 ORDERBY 這些命令的時候,性能提高更為明顯。

索引應建立在那些將用于 JOIN, WHERE 判斷和 ORDER BY 排序的字段上。盡量不要對數據庫中某個含有大量重復的值的字段建立索引。對于一個 ENUM 類型的字段來說,出現大量重復值是很有可能的情況,例如 customerinfo 中的 “province”.. 字段,在這樣的字段上建立索引將不會有什么幫助;相反,還有可能降低數據庫的性能。

普通索引(由關鍵字 KEY 或 INDEX 定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。

唯一索引的好處:一是簡化了 MySQL 對這個索引的管理工作,這個索引也因此而變得更有效率;二是 MySQL 會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段里出現過了;如果是,MySQL 將拒絕插入那條新記錄。也就是說,唯一索引可以保證數據記錄的唯一性。在許多場合,創建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數據出現重復。

8. 優化的查詢語句

SELECT FROM order WHERE YEAR(OrderDate)<2001; 
SELECT FROM order WHERE OrderDate<"2001-01-01";
SELECT FROM inventory WHERE Amount/7<24; 
SELECT FROM inventory WHERE Amount<24*7;

避免在查詢中讓 MySQL 進行自動類型轉換,因為轉換過程也會使索引變得不起作用。

9. 索引失效情況

like 以 % 開頭,索引無效;當 like 前綴沒有 %,后綴有 % 時,索引有效。

or 語句前后沒有同時使用索引。當 or 左右查詢字段只有一個是索引,該索引失效,只有當 or 左右查詢字段均為索引時,才會生效。

組合索引,不是使用第一列索引,索引失效。

數據類型出現隱式轉化。如 varchar 不加單引號的話可能會自動轉換為 int 型,使索引無效,產生全表掃描。

在索引字段上使用 not,<>,!=。不等于操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃描。 優化方法: key<>0 改為 key>0 or key<0。

當全表掃描速度比索引速度快時,mysql 會使用全表掃描,此時索引失效。

應盡量避免在 where 子句中使用 or,and,in,not in 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,合理使用 union all(允許重復的值,請使用 UNION ALL)。

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10    
union all    
select id from t where num=20

10. 引擎的選取

MyISAM 索引文件在數據庫中存放的對應表的磁盤文件有.frm,.MYD,*.MYI 結尾的三個文件:

frm 文件是存放的表結構,表的定義信息;

MYD 文件是存放著表中的數據;

MYI 文件存放著表的索引信息;

InnoDB 存儲引擎在磁盤中存放的對應的表的磁盤文件有.frm,.ibd 這兩個文件;

frm 文件是存放表結構,表的定義信息;

ibd 文件是存放 表中的數據、索引信息;

詳細出處參考:https://blog.csdn.net/jinxingfeng_cn/article/details/16878355

性能方面的優化:

explain 執行計劃 ==>https://blog.csdn.net/yhl_jxy/article/details/88570154

一、分表的分類(單表記錄條數達到百萬到千萬級別時就要使用分表)

1. 縱向分表

文章標題,作者,分類,創建時間等,是變化頻率慢,查詢次數多,而且最好有很好的實時性的數據,我們把它叫做冷數據。

瀏覽量,回復數等,類似的統計信息,或者別的變化頻率比較高的數據,我們把它叫做活躍數據。

首先存儲引擎的使用不同,冷數據使用 MyIsam 可以有更好的查詢數據。活躍數據,可以使用 Innodb , 可以有更好的更新速度。

就是把原來一張表里的字段,冷數據的字段和活躍數據的字段分別建立 2 張表來管理。

2. 橫向分表

把大的表結構,橫向切割為同樣結構的不同表,如,用戶信息表,user_1,user_2 等,表結構是完全一樣。

二、慢查詢

show variables like 'slow%';
show global status like 'slow%';

使用 mysqlreport;

正確使用索引:explain 分析查詢語句,組合索引,索引副作用(占空間、update)

開啟慢查詢日志、使用慢查詢分析工具 mysqlsla;

索引緩存、索引代價(插入更新索引);

表鎖,行鎖,行鎖副作用(update 多時候變慢),在 select 和 update 混合的情況下,行鎖巧妙解決了讀寫互斥的問題;

開啟使用查詢緩存;

修改臨時表內存空間;

開啟線程池;

MySQL Query 語句優化的基本思路和原則

1、優化需要優化的 Query;

2、定位優化對象的性能瓶頸;

3、明確優化目標;

4、從 Explaing 入手;

5、多使用 Profile;

6、永遠用小結果集推動大的結果集;

7、盡可能在索引中完成排序;

8、只取自己需要的 Columns;

9、僅僅使用最有效的過濾條件;

10、盡可能避免復雜的 Join 和子查詢。

關于MySQL優化就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

迭部县| 宁陕县| 西贡区| 禹州市| 道孚县| 台湾省| 舟曲县| 荃湾区| 左贡县| 汨罗市| 大埔县| 安福县| 五台县| 遵化市| 儋州市| 杭锦后旗| 龙陵县| 蒙阴县| 灵武市| 云浮市| 张家口市| 贞丰县| 塘沽区| 民县| 会同县| 疏勒县| 政和县| 石首市| 万盛区| 改则县| 望江县| 巴青县| 兴文县| 蓝山县| 沂源县| 淄博市| 金坛市| 互助| 穆棱市| 曲沃县| 汉阴县|