MySQL參數(shù)優(yōu)化

MySQL參數(shù)優(yōu)化

1:MySQL 默認(rèn)的最大連接數(shù)為 100,可以在 mysql 客戶端使用以下命令查看

mysql> show variables like 'max_connections';

2:查看當(dāng)前訪問Mysql的線程

mysql> show processlist;

3:設(shè)置最大連接數(shù)

mysql>set globle max_connections = 5000;

最大可設(shè)置16384,超過沒用

4:查看當(dāng)前被使用的connections

mysql>show globle status like 'max_user_connections'

(一) 使用查詢緩存優(yōu)化查詢

大多數(shù)的MySQL服務(wù)器都開啟了查詢緩存。這是提高性能最有效的方法之一,而且這是被MySQL引擎處理的。當(dāng)有很多相同的查詢被執(zhí)行了多次的時候,這些查詢結(jié)果會被放入一個緩存中,這樣后續(xù)的相同查詢就不用操作而直接訪問緩存結(jié)果了。

這里最主要的問題是,對于我們程序員來說,這個事情是很容易被忽略的。因為我們某些查詢語句會讓MySQL不使用緩存,示例如下:

1:SELECT username FROM user WHERE ? ?signup_date >= CURDATE()

2:SELECT username FROM user WHERE ? ?signup_date >= '2014-06-24‘

上面兩條SQL語句的差別就是 CURDATE() ,MySQL的查詢緩存對這個函數(shù)不起作用。所以,像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數(shù)都不會開啟查詢緩存,因為這些函數(shù)的返回是會不定的易變的。所以,你所需要的就是用一個變量來代替MySQL的函數(shù),從而開啟緩存。

(二) 使用EXPLAIN關(guān)鍵字檢測查詢

使用EXPLAIN關(guān)鍵字可以使我們知道MySQL是如何處理SQL語句的,這樣可以幫助我們分析我們的查詢語句或是表結(jié)構(gòu)的性能瓶頸;EXPLAIN的查詢結(jié)果還會告訴我們索引主鍵是如何被利用的,數(shù)據(jù)表是如何被被搜索或排序的....等等。語法格式是:EXPLAIN +SELECT語句;


(三)當(dāng)只要一行數(shù)據(jù)時使用LIMIT 1

加上LIMIT 1可以增加性能。MySQL數(shù)據(jù)庫引擎會在查找到一條數(shù)據(jù)后停止搜索,而不是繼續(xù)往后查詢下一條符合條件的數(shù)據(jù)記錄。

(四)為搜索字段建立索引

索引不一定就是給主鍵或者是唯一的字段,如果在表中,有某個字段經(jīng)常用來做搜索,需要將其建立索引。

索引的有關(guān)操作如下:

1.創(chuàng)建索引

在執(zhí)行CREATE TABLE語句時可以創(chuàng)建索引,也可以單獨用CREATE INDEX或ALTER TABLE來為表增加索引。

1.1> ALTER TABLE

ALTER TABLE 用來創(chuàng)建普通索引、唯一索引、主鍵索引和全文索引

ALTER TABLE table_name ADD INDEX index_name (column_list);

ALTER TABLE table_name ADD UNIQUE (column_list);

ALTER TABLE table_name ADD PRIMARY KEY (column_list);

ALTER TABLE table_name ADD FULLTEXT (column_list);

其中table_name是要增加索引名的表名,column_list指出對哪些列列進(jìn)行索引,多列時各列之間使用半角逗號隔開。索引名index_name是可選的,如果不指定索引名稱,MySQL將根據(jù)第一個索引列自動指定索引名稱,另外,ALTER TABLE允許在單個語句中更改多個表,因此可以在同時創(chuàng)建多個索引。

1.2> CREATE INDEX

CREATE INDEX可對表增加普通索引或UNIQUE索引以及全文索引,但是不可以對表增加主鍵索引

CREATE INDEX index_name ON table_name (column_list);

CREATE UNIQUE index_name ON table_name (column_list);

CREATE FULLTEXT index_name ON table_name (column_list);

table_name、index_name和column_list具有與ALTER TABLE語句中相同的含義,索引名必須指定。另外,不能用CREATE INDEX語句創(chuàng)建PRIMARY KEY索引。

2.索引類型

普通索引INDEX:適用于name、email等一般屬性

唯一索引UNIQUE:與普通索引類似,不同的是唯一索引要求索引字段值在表中是唯一的,這一點和主鍵索引類似,但是不同的是,唯一索引允許有空值。唯一索引一般適用于身份證號碼、用戶賬號等不允許有重復(fù)的屬性字段上。

主鍵索引:其實就是主鍵,一般在建表時就指定了,不需要額外添加。

全文檢索:只適用于VARCHAR和Text類型的字段。

注意:全文索引和普通索引是有很大區(qū)別的,如果建立的是普通索引,一般會使用like進(jìn)行模糊查詢,只會對查詢內(nèi)容前一部分有效,即只對前面不使用通配符的查詢有效,如果前后都有通配符,普通索引將不會起作用。對于全文索引而言在查詢時有自己獨特的匹配方式,例如我們在對一篇文章的標(biāo)題和內(nèi)容進(jìn)行全文索引時:

ALTER TABLE article ADD FULLTEXT ('title', 'content'); 在進(jìn)行檢索時就需要使用如下的語法進(jìn)行檢索:

SELECT * FROM article WHERE MATCH('title', 'content') AGAINST ('查詢字符串');

在使用全文檢索時的注意事項:

MySql自帶的全文索引只能用于數(shù)據(jù)庫引擎為MYISAM的數(shù)據(jù)表,如果是其他數(shù)據(jù)引擎,則全文索引不會生效。此外,MySql自帶的全文索引只能對英文進(jìn)行全文檢索,目前無法對中文進(jìn)行全文檢索。如果需要對包含中文在內(nèi)的文本數(shù)據(jù)進(jìn)行全文檢索,我們需要采用Sphinx(斯芬克斯)/Coreseek技術(shù)來處理中文。另外使用MySql自帶的全文索引時,如果查詢字符串的長度過短將無法得到期望的搜索結(jié)果。MySql全文索引所能找到的詞默認(rèn)最小長度為4個字符。另外,如果查詢的字符串包含停止詞,那么該停止詞將會被忽略。

3.組合索引

組合索引又稱多列索引,就是建立索引時指定多個字段屬性。有點類似于字典目錄,比如查詢 'guo' 這個拼音的字時,首先查找g字母,然后在g的檢索范圍內(nèi)查詢第二個字母為u的列表,最后在u的范圍內(nèi)查找最后一個字母為o的字。比如組合索引(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的

組合索引的生效原則是 ?從前往后依次使用生效,如果中間某個索引沒有使用,那么斷點前面的索引部分起作用,斷點后面的索引沒有起作用;

(五)在join表的時候使用相當(dāng)類型的列,并將其索引

如果在程序中有很多JOIN查詢,應(yīng)該保證兩個表中join的字段時被建立過索引的。這樣MySQL顳部會啟動優(yōu)化JOIN的SQL語句的機(jī)制。注意:這些被用來JOIN的字段,應(yīng)該是相同類型的。例如:如果要把 DECIMAL 字段和一個 INT 字段Join在一起,MySQL就無法使用它們的索引。對于那些STRING類型,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣) ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容