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類型,還需要有相同的字符集才行。(兩個表的字符集有可能不一樣) ?