找回密碼
 註冊
[日本手機遊戲APPS下載] 手機遊戲專區 熱門短片

型男索女 
查看: 3838|回復: 1

[轉貼][優化]MYSQL程式優化

  [複製鏈接]
發表於 26-10-2006 15:36:33 | 顯示全部樓層 |閱讀模式
SQL语句优化的原则:
==================
1、使用索引来更快地遍历表。
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引
下,数据在物理上随机存放在数据页上。合理的索引设计要建立在
对各种查询的分析和预测上。一般来说:
a.有大量重复值、且&#32463;常有范&#22260;查&#35810;( > ,< ,> =,< =)和order by、group by&#21457;生的列,可考
&#34385;建立群集索引;
b.&#32463;常同&#26102;存取多列,且每列都含有重复值可考&#34385;建立&#32452;合索引;
c.&#32452;合索引要&#23613;量使&#20851;&#38190;查&#35810;形成索引覆&#30422;,其前&#23548;列一定是使用最&#39057;繁的列。索引&#34429;有助于提高性能但不是索引越多越好,恰好相反&#36807;多的索引&#20250;&#23548;致系&#32479;低效。用&#25143;在表中每加&#36827;一&#20010;索引,&#32500;&#25252;索引集合就要做相&#24212;的更新工作。
2、在海量查&#35810;&#26102;&#23613;量少用格式&#36716;&#25442;。
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短&#35821;,任何一种索引都有助于SELECT的性能提高。
7、任何&#23545;列的操作都&#23558;&#23548;致表&#25195;描,它包括&#25968;据&#24211;函&#25968;、&#35745;算表&#36798;式等等,查&#35810;&#26102;要&#23613;可能&#23558;操作移至等&#21495;右&#36793;。
4、IN、OR子句常&#20250;使用工作表,使索引失效。如果不&#20135;生大量重复值,可以考&#34385;把子句拆&#24320;。拆&#24320;的子句中&#24212;&#35813;包含索引。

Mysql的优化原&#21017;2:
1、只要能&#28385;足你的需求,&#24212;&#23613;可能使用更小的&#25968;据&#31867;型:例如使用MEDIUMINT代替INT
2、&#23613;量把所有的列&#35774;置&#20026;NOT NULL,如果你要保存NULL,手&#21160;去&#35774;置它,而不是把它&#35774;&#20026;默&#35748;值。
3、&#23613;量少用VARCHAR、TEXT、BLOB&#31867;型
4、如果你的&#25968;据只有你所知的少量的几&#20010;。最好使用ENUM&#31867;型
5、正如graymice所&#35762;的那&#26679;,建立索引。
以下是我做的一&#20010;&#23454;&#39564;,可以&#21457;&#29616;索引能极大地提高查&#35810;的效率:

我有一&#20010;&#20250;&#21592;信息表users,里&#36793;有37365&#26465;用&#25143;&#35760;&#24405;:

在不加索引的&#26102;候&#36827;行查&#35810;:
sql&#35821;句A:
select * from users where username like '%&#35768;%';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960&#26465;&#35760;&#24405;

sql&#35821;句B:
select * from users where username like '&#35768;%';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836&#26465;&#35760;&#24405;

sql&#35821;句C:
select * from users where username like '%&#35768;';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7&#26465;&#35760;&#24405;

&#20026;username列添加索引:
create index usernameindex on users(username(6));

再次查&#35810;:
sql&#35821;句A:
select * from users where username like '%&#35768;%';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960&#26465;&#35760;&#24405;

sql&#35821;句B:
select * from users where username like '&#35768;%';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836&#26465;&#35760;&#24405;

sql&#35821;句C:
select * from users where username like '%&#35768;';
在Mysql-Front中的8次查&#35810;&#26102;&#38271;&#20026;:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7&#26465;&#35760;&#24405;


在&#23454;&#39564;&#36807;程中,我&#27809;有另&#24320;任何程序,以上的&#25968;据&#35828;明在&#21333;表查&#35810;中,建立索引的可以极大地提高查&#35810;速度。
另外要&#35828;的是如果建立了索引,&#23545;于like '&#35768;%'&#31867;型的查&#35810;,速度提升是最明&#26174;的。因此,我&#20204;在&#20889;sql&#35821;句的&#26102;候也&#23613;量采用&#36825;种方式查&#35810;。

&#23545;于多表查&#35810;我&#20204;的优化原&#21017;是:

&#23613;量&#23558;索引建立在:left join on/right join on ... +&#26465;件,的&#26465;件&#35821;句中所涉及的字段上。

多表查&#35810;比&#21333;表查&#35810;更能体&#29616;索引的优&#21183;。


6、索引的建立原&#21017;:
如果一列的中&#25968;据的前&#32512;重复值很少,我&#20204;最好就只索引&#36825;&#20010;前&#32512;。Mysql支持&#36825;种索引。我在上面用到的索引方法就是&#23545;username最左&#36793;的6&#20010;字符&#36827;行索引。索引越短,占用的

磁&#30424;空&#38388;越少,在&#26816;索&#36807;程中花的&#26102;&#38388;也越少。&#36825;方法可以&#23545;最多左255&#20010;字符&#36827;行索引。

在很多&#22330;合,我&#20204;可以&#32473;建立多列&#25968;据建立索引。

索引&#24212;&#35813;建立在查&#35810;&#26465;件中&#36827;行比&#36739;的字段上,而不是建立在我&#20204;要找出&#26469;并且&#26174;示的字段上

7、一往情深&#38382;到的&#38382;&#39064;:IN、OR子句常&#20250;使用工作表,使索引失效。如果不&#20135;生大量重复值,可以考&#34385;把子句拆&#24320;。拆&#24320;的子句中&#24212;&#35813;包含索引。

&#36825;句&#35805;怎么理解&#20915;,&#35831;&#20030;&#20010;例子

例子如下:
如果在fields1和fields2上同&#26102;建立了索引,fields1&#20026;主索引
以下sql&#20250;用到索引
select * from tablename1 where fields1='value1' and fields2='value2'
以下sql不&#20250;用到索引
select * from tablename1 where fields1='value1' or fields2='value2'

以上一些只是一些很&#31616;&#21333;的&#19996;西,希望&#20889;出&#26469;之后大家不要笑&#35805;我,有什么&#38382;&#39064;的&#35805;&#35831;大家&#32473;我指出&#26469;,&#35874;&#35874;!

&#34917;充:
1.索引&#24102;&#26469;查&#35810;上的速度的大大提升,但索引也占用了&#39069;外的硬&#30424;空&#38388;(&#24403;然&#29616;在一般硬&#30424;空&#38388;不成&#38382;&#39064;),而且往表中插入新&#35760;&#24405;&#26102;索引也要&#38543;&#30528;更新&#36825;也需要一定&#26102;&#38388;.
有些表如果&#32463;常insert,而&#36739;少select,就不用加索引了.不然每次&#20889;入&#25968;据都要重新改&#20889;索引,花&#36153;&#26102;&#38388;;
&#36825;&#20010;&#35270;&#23454;&#38469;情&#20917;而定,通常情&#20917;下索引是必需的.
2.我在&#23545;查&#35810;效率有怀疑的&#26102;候,一般是直接用Mysql的Explain&#26469;跟&#36394;查&#35810;情&#20917;.
你用Mysql-Front是通&#36807;&#26102;&#38271;&#26469;比&#36739;,我&#35273;得如果&#20174;查&#35810;&#26102;&#25195;描字段的次&#25968;&#26469;比&#36739;更精确一些.
回復

使用道具 舉報

發表於 23-11-2006 06:31:15 | 顯示全部樓層

幫佢繁左佢..(冇乜用...)

SQL語句優化的原則:
==================
1、使用索引來更快地遍歷表。
缺省情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引
下,數據在物理上隨機存放在數據頁上。合理的索引設計要建立在
對各種查詢的分析和預測上。一般來說:
a.有大量重複值、且經常有範圍查詢( > ,< ,> =,< =)和order by、group by發生的列,可考
慮建立群集索引;
b.經常同時存取多列,且每列都含有重複值可考慮建立組合索引;
c.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助於提高性能但不是索引越多越好,恰好相反過多的索引會導致系統低效。用戶在表中每加進一個索引,維護索引集合就要做相應的更新工作。
2、在海量查詢時盡量少用格式轉換。
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。
7、任何對列的操作都將導致表掃瞄,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。
4、IN、OR子句常會使用工作表,使索引失效。如果不產生大量重複值,可以考慮把子句拆開。拆開的子句中應該包含索引。

Mysql的優化原則2:
1、只要能滿足你的需求,應盡可能使用更小的數據類型:例如使用MEDIUMINT代替INT
2、盡量把所有的列設置為NOT NULL,如果你要保存NULL,手動去設置它,而不是把它設為默認值。
3、盡量少用VARCHAR、TEXT、BLOB類型
4、如果你的數據只有你所知的少量的幾個。最好使用ENUM類型
5、正如graymice所講的那樣,建立索引。
以下是我做的一個實驗,可以發現索引能極大地提高查詢的效率:

我有一個會員信息表users,裡邊有37365條用戶記錄:

在不加索引的時候進行查詢:
sql語句A:
select * from users where username like '%許%';
在Mysql-Front中的8次查詢時長為:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960條記錄

sql語句B:
select * from users where username like '許%';
在Mysql-Front中的8次查詢時長為:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836條記錄

sql語句C:
select * from users where username like '%許';
在Mysql-Front中的8次查詢時長為:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7條記錄

為username列添加索引:
create index usernameindex on users(username(6));

再次查詢:
sql語句A:
select * from users where username like '%許%';
在Mysql-Front中的8次查詢時長為:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960條記錄

sql語句B:
select * from users where username like '許%';
在Mysql-Front中的8次查詢時長為:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836條記錄

sql語句C:
select * from users where username like '%許';
在Mysql-Front中的8次查詢時長為:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7條記錄


在實驗過程中,我沒有另開任何程序,以上的數據說明在單表查詢中,建立索引的可以極大地提高查詢速度。
另外要說的是如果建立了索引,對於like '許%'類型的查詢,速度提升是最明顯的。因此,我們在寫sql語句的時候也盡量採用這種方式查詢。

對於多表查詢我們的優化原則是:

盡量將索引建立在:left join on/right join on ... +條件,的條件語句中所涉及的字段上。

多表查詢比單表查詢更能體現索引的優勢。


6、索引的建立原則:
如果一列的中數據的前綴重複值很少,我們最好就只索引這個前綴。Mysql支持這種索引。我在上面用到的索引方法就是對username最左邊的6個字符進行索引。索引越短,佔用的

磁盤空間越少,在檢索過程中花的時間也越少。這方法可以對最多左255個字符進行索引。

在很多場合,我們可以給建立多列數據建立索引。

索引應該建立在查詢條件中進行比較的字段上,而不是建立在我們要找出來並且顯示的字段上

7、一往情深問到的問題:IN、OR子句常會使用工作表,使索引失效。如果不產生大量重複值,可以考慮把子句拆開。拆開的子句中應該包含索引。

這句話怎麼理解決,請舉個例子

例子如下:
如果在fields1和fields2上同時建立了索引,fields1為主索引
以下sql會用到索引
select * from tablename1 where fields1='value1' and fields2='value2'
以下sql不會用到索引
select * from tablename1 where fields1='value1' or fields2='value2'

以上一些只是一些很簡單的東西,希望寫出來之後大家不要笑話我,有什麼問題的話請大家

評分

參與人數 1樂點 +5 收起 理由
MST + 5 熱心協助

查看全部評分

回復 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

小黑屋|Archiver|手機版|Nakuz.com |網站地圖

GMT+8, 27-8-2026 10:05 , Processed in 0.068109 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表