SQL優化策略


mysql添加索引

1、主鍵索引
LATER TABLE 'table_neme' ADD PRIMARY KEY('column');
2、唯一索引
unique空串(null)可以放多個 如果是具體的內容則不能重復
a: 肯定在where條經常使用 ;
b: 該字段的內容不是唯一的幾個值(sex); (只有三個數據形成2級二叉樹)
c: 字段內容不是頻繁變化.
ALTER TABLE 'table_name' ADD UNIQUE ('column');
3、普通索引
ALTER TABLE 'table_name' ADD INDEX ('column');
4、全文索引(主要是針對對文件,文本的檢索, 比如文章, 全文索引針對MyISAM有用)
ALTER TABLE 'table_name' ADD FULLTEXT ('column');
5、多列索引
ALTER TABLE 'table_name' ADD INDEX index_name('column1','column2','column3');

更詳細的添加索引的方法
mysql中可以使用alter table這個sql語句來為表中的字段添加索引。
ALTER TABLE <表名> ADD INDEX <字段>;

ag:我們來嘗試為test中t_name字段添加一個索引
alter table test add index(t_name);
這個會產生結果,t_name字段的key這一覽由原來的空白變成了MUL.
這個的含義就是該列的值是可以重復的,該列是一個非唯一索引的簽到列,或者是一個唯一索引的組成部分但是可以含空值NULL。

SQL優化分三個方面:
1、慢查詢
2、索引
3、拆分表


SQL優化之索引:
1、在表中建立索引,優先考慮where、group by使用到的字段
2、盡量避免使用select *,返回無用的字段會降低查詢效率。
優化方法:使用具體的字段代替*,只返回使用到的字段。
3、盡量避免使用in和not in,會導致數據庫引擎放棄索引,進行全表掃描。
如下:SELECT * FROM t WHERE id IN(2,3)
SELECT * FROM t1 WHERE usename IN(SELECT username FROM t2)
優化方法:如果是連續數值,可以用between代替,如下:
SELECT * FROM t WHERE id BETWEEN 2 AND 3
如果是子查詢,可以使用exists代替,如下:
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM WHERE t1.username=t2.username);
4、盡量避免使用or,會導致數據庫引擎放棄索引查詢而進行全表掃描。如下:
SELECT * FROM t WHERE id = 1 OR id = 3;
優化方式:可以使用union代替or。如下:
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3;
(ps:如果or兩邊的字段是同一個,如例子中的這樣。貌似兩者效率差不多,其實union掃描的索引,or掃描的是全表)
5、盡量避免在字段開頭模糊查詢,會導致數據庫引擎放棄索引進行全表掃描,如下:
SELECT * FROM t WHERE username LIKE '%li%';
優化方式:盡量在字段后面使用模糊查詢,如下:
SELECT * FROM t WHERE username LIKE 'li%';
6、盡量避免進行null值的判斷,會導致數據可引擎放棄索引而進行全表掃描。如下:
SELECT * FROM t WHERE score IS NULL;
優化方式:可以給字段添加默認值0,對0值進行判斷。
如下:
SELECT * FROM t WHERE score = 0;
7、盡量避免在where條件中等號的左側進行表達式、函數操作,會導致數據庫引擎放棄索引進行全表掃描。如下:
SELECT * FROM t2 WHERE SCORE/10 = 9;
SELECT * FROM t2 WHERE SUBSTR(USERNAME,1,2)='li';
優化方式:可以將表達式、函數操作移動到等號右側。如下:
SELECT * FROM t2 WHERE score = 10*9;
SELECT * FROM t2 WHERE username LIKE 'li%';
8、當數據量大時,避免使用where 1=1的條件。通常為了方便拼裝查詢條件,我們會默認使用該條件,數據庫引擎會放棄索引進行全表掃描。
如下:
SELECT * FROM t WHERE 1=1;
優化方式:用代碼拼裝sql時進行判斷,沒where加where,有where加and.

SQL優化之慢查詢:
1)、數據庫中設置sql慢查詢
一、第一步,開啟mysql慢查詢
方式一:修改配置文件,在my.ini增加幾行,主要是慢查詢的定義時間(超過2秒就是慢查詢),以及慢查詢log日志記錄(slow_query_log)

//定義超過多少秒的查詢是慢查詢,這里定義的是2秒
long_query_time=2
//記錄下沒有使用索引的query
long_query_not_using_indexes
第二步:通過mysql數據庫開啟慢查詢
mysql->set global slow_query_log=ON
mysql->set global long_query_time = 3600
mysql->set global long_querise_not_using_indexes = ON

 

未完,待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM