国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術|

服務器之家 - 數(shù)據(jù)庫 - Mysql - mysql優(yōu)化通常使用的幾種方法

mysql優(yōu)化通常使用的幾種方法

2020-10-20 21:59專注的阿熊 Mysql

本文分享一下常見的幾種MySQL數(shù)據(jù)優(yōu)化方式,有需要的同學可以參考下

分享一下常見的幾種MySQL數(shù)據(jù)優(yōu)化方式。。。。。。。

選取最適合的字段屬性

1、MySQL可以很好的支持數(shù)據(jù)量的很大的存取,但是一般說來,數(shù)據(jù)庫中的表越小其查詢的速度就也快。所以,可以在建表的時候,為了獲取更好的性能,將表中的字段長度設的盡可能的小。

2、盡可能的把字段設置成NOT NULL,這樣在執(zhí)行查詢的時候,數(shù)據(jù)庫不用去比較NULL值。

3、對于部分的文本字段,例如“性別”或者“民族”,我們就可以用enum來定義。MySQL會把enum類型的數(shù)據(jù)當作數(shù)值型來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快的多。這樣我們就可以提高數(shù)據(jù)庫的性能。

使用連接(JOIN)來代替子查詢是(sub-Queries)

MySQL從4.1開始就支持SQL的子查詢。這個技術可以使用select語句來創(chuàng)建一個單列的查詢結果,然后把這個結果作為過濾條件用在另一個查詢中。

例:將客戶基本信息表中沒有任何訂單的客戶刪除掉

DELETE FROM customerinfo WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo)

利用子查詢先從銷售信息表中將所有發(fā)出訂單的客戶ID取出,然后將結果傳遞給主查詢。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖死,并且寫起來也很容易。但是,在某些情況下,子查詢可以被更有效率的連接(JOIN)替代。

例:將所有沒有訂單記錄的用戶取出來

SELECT * FROM customerinfo WHERE CustomerID NOT IN (SELECTC ustomerID FROM salesinfo)

如果使用連接(JOIN)來完成這個查詢工作,速度將會很快。尤其是當salesinfo表中對CustomerID建有索引的話,性能將會更好:

SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID WHERE salesinfo.CustomerID ISNULL

Swift Code

連接(JOIN)之所以更有效率一些,是因為MySQL不需要在內(nèi)存中創(chuàng)建臨時表來完成這個邏輯上的需求兩個步驟的查詢工作。

使用聯(lián)合(union)來代替手動創(chuàng)建的臨時表

Union查詢可以把需要使用臨時表的兩條或者更多的select查詢合并成一個查詢中。在客戶端的查詢會話結束的時候,臨時表會被自動刪除,從而保證數(shù)據(jù)庫的整齊、高效。使用union來創(chuàng)建查詢的時候,只需要用union作為關鍵字把多個select語句連接起來就可以了(所有的select語句中的字段數(shù)目相同)

SELECT Name,Phone FROM client UNION

SELECT Name,BirthDate FROM author UNION

SELECT Name,Supplier FROM product

事務

盡管我們可以使用子查詢(Sub-Queries)、連接(JOIN)和聯(lián)合(UNION)來創(chuàng)建各種各樣的查詢,但不是所有的數(shù)據(jù)庫操作都可以只用一條或少數(shù)幾條SQL語句就可以完成的。更多的時候是需要用到一系列的語句來完成某種工作。但是在這種情況下,當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。設想一下,要把某個數(shù)據(jù)同時插入兩個相關聯(lián)的表中,可能會出現(xiàn)這樣的情況:第一個表中成功更新后,數(shù)據(jù)庫突然出現(xiàn)意外狀況,造成第二個表中的操作沒有完成,這樣,就會造成數(shù)據(jù)的不完整,甚至會破壞數(shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應該使用事務,它的作用是:要么語句塊中每條語句都操作成功,要么都失敗。換句話說,就是可以保持數(shù)據(jù)庫中數(shù)據(jù)的一致性和完整性。事物以BEGIN關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那么,ROLLBACK命令就可以把數(shù)據(jù)庫恢復到BEGIN開始之前的狀態(tài)。

BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book'; COMMIT;

事務的另一個重要作用是當多個用戶同時使用相同的數(shù)據(jù)源時,它可以利用鎖定數(shù)據(jù)庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。

鎖定表

盡管事務是維護數(shù)據(jù)庫完整性的一個非常好的方法,但卻因為它的獨立性,有時會影響數(shù)據(jù)庫的性能,尤其是在很大的應用系統(tǒng)中,由于在事務執(zhí)行的過程中,數(shù)據(jù)庫將會被鎖定,因此其它的用戶請求只能暫時等待直到該事務結束。如果一個數(shù)據(jù)庫系統(tǒng)只有少數(shù)幾個用戶來使用,事務造成的影響不會成為一個太大的問題;但假設有成千上萬的用戶同時訪問一個數(shù)據(jù)庫系統(tǒng),就會產(chǎn)生比較嚴重的相應延遲。其實,有些情況下可以通過鎖定表的方法來獲得更好的性能。

LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item='book';

...

UPDATE inventory SET Quantity=11 WHERE Item='book'; UNLOCKTABLES

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

使用外鍵

鎖定表的方法可以維護數(shù)據(jù)的完整性,但是它卻不能保證數(shù)據(jù)的關聯(lián)性。這個時候就可以使用外鍵。

例如,外鍵可以保證每一條銷售記錄都指向某一個存在的客戶。外鍵可以把customerinfo表中的CustomerID映射到salesinfo表中的CustomerID,任何的一條沒有合法CustomerID的記錄都不會被更新或者插入到salesinfo中。

CREATE TABLE customerinfo( CustomerIDINT NOT

NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;

CREATE TABLE salesinfo( SalesIDNT NOT NULL,CustomerIDINT NOT NULL, PRIMARYKEY(CustomerID,SalesID),

FOREIGNKEY(CustomerID) REFERENCES customerinfo(CustomerID) ON DELETE CASCADE)TYPE=INNODB;

注意例子中的參數(shù)“ON DELETE CASCADE”。該參數(shù)保證當customerinfo表中的一條客戶記錄被刪除的時候,salesinfo表中所有與該客戶相關的記錄也會被自動刪除。如果要在MySQL中使用外鍵,一定要記住在創(chuàng)建表的時候?qū)⒈淼念愋投x為事務安全表InnoDB類型。該類型不是MySQL表的默認類型。定義的方法是在CREATETABLE語句中加上TYPE=INNODB

使用索引

索引是提高數(shù)據(jù)庫性能的常用方法,它可以令數(shù)據(jù)庫服務器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(),MIN()和ORDERBY這些命令的時候,性能提高更為明顯。

一般說來,索引應建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。盡量不要對數(shù)據(jù)庫中某個含有大量重復的值的字段建立索引。對于一個ENUM類型的字段來說,出現(xiàn)大量重復值是很有可能的情況

例如customerinfo中的“province”..字段,在這樣的字段上建立索引將不會有什么幫助;相反,還有可能降低數(shù)據(jù)庫的性能。我們在創(chuàng)建表的時候可以同時創(chuàng)建合適的索引,也可以使用ALTERTABLE或CREATEINDEX在以后創(chuàng)建索引。此外,MySQL從版本3.23.23開始支持全文索引和搜索。全文索引在MySQL中是一個FULLTEXT類型索引,但僅能用于MyISAM類型的表。對于一個大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個沒有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX創(chuàng)建索引,將是非常快的。但如果將數(shù)據(jù)裝載到一個已經(jīng)有FULLTEXT索引的表中,執(zhí)行過程將會非常慢。

優(yōu)化查詢語句

絕大多數(shù)的情況下,使用索引可以提高查詢的速度,但是SQL語句使用不恰當?shù)脑挘饕龑o法發(fā)揮它應有的作用。

在相同類型的字段間進行比較的操作。

在建有索引的字段上盡量不要使用函數(shù)進行操作。

例如:在一個date類型的字段上使用yeae()函數(shù)時,將會使索引不能發(fā)揮應有的作用。

3.在搜索字符型字段時,我們有時會使用like關鍵字和通配符,這種做法雖然簡單,但卻也是以犧牲系統(tǒng)性能為代價的。后者的查詢速度明顯比前者快得多。

SELECT * FROM books WHERE name like"MySQL%"

SELECT * FROM books WHERE name>="MySQL" andname <"MySQM"

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

原文地址:http://blog.chinaunix.net/uid-69946337-id-5828729.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久无码av | 日本黄色激情片 | 亚洲欧美视频播放 | 欧美精品国产精品 | 国产精品亚洲自拍 | 欧美日韩一区二区三区不卡视频 | 久久av资源网 | 日本中文在线视频 | 精品小视频 | 九色网址 | 亚洲电影一区二区 | 国产尤物一区 | 日韩高清一区 | www.国产精 | a一级免费视频 | 国产精品永久久久久久久久久 | 精品久久亚洲 | 亚洲精品久久久久一区二区三区 | 精一区二区 | 久久久一 | 夜夜爽av福利精品导航 | 久久综合久色欧美综合狠狠 | 天天天操 | av亚洲在线 | 国产视频精品免费 | 日本中文在线 | www中文字幕 | 91精品久久久久久 | 亚洲一区久久 | 国厂毛片 | 免费性大片 | 成人在线中文字幕 | 99亚洲伊人久久精品影院 | 日韩不卡在线 | 亚洲精品国产综合区久久久久久久 | 久久久高清| 精品电影| 亚洲va国产天堂va久久 en | 日韩一区中文字幕 | 欧美影| 亚洲精品视频一区二区三区 |