常用的數據庫索引優化語句總結
不管是用C/C++/Java等代碼編寫的程序,還是SQL編寫的數據庫腳本,都存在一個持續優化的過程。也就是說,代碼優化對于程序員來說,是一個永恒的話題。
近期,我們對之前編寫的數據庫腳本進行了全面的自查,從數據庫的性能方面考慮,將腳本里面的很多SQL語句進行了優化。對于一條SQL語句來說,索引的使用是否正確將直接影響到數據庫的性能,因此,對索引使用方法的優化是數據庫性能優化的重點。本文對常用的數據庫索引優化語句進行了總結,可供相關的開發人員參考。
在本文中,使用如下的表tb_test作為示例進行說明:
- create table tb_test
- (
- id int not null,
- age int not null,
- name varchar(30) not null,
- addr varchar(50) not null
- );
- create unique index idx1_tb_test on tb_test(id);
- create index idx2_tb_test on tb_test(name);
- create index idx3_tb_test on tb_test(addr);
索引優化建議
1.對索引列進行計算
例如,我們想要將表tb_test中id大于100的數據記錄中的age和name查找出來。
正確的SQL語句是:
- select age,name from tb_test where id > 1*100;
不建議采用的SQL語句是:
- select age,name from tb_test where id/100 > 1;
2.對索引列進行拼接
例如,我們想要將表tb_test中name為“zhou”、addr為“CQ”的記錄中的id和age查找出來。
正確的SQL語句是:
- select id,age from tb_test where name=’zhou’ and addr=’CQ’;
不建議采用的SQL語句是:
- select id,age from tb_test where concat(name,’ ‘,addr) = ‘zhou CQ’;
3.在索引列上is null或is not null的使用
例如,我們想要將表tb_test中id大于等于“0”的記錄中的age查找出來。
正確的SQL語句是:
- select age from tb_test where id >= 0;
不建議采用的SQL語句是:
- select age from tb_test where id is not null;
4.在索引列上or的使用
例如,我們想要將表tb_test中id等于101或102的記錄中的age和name查找出來。
正確的SQL語句(使用union)是:
- select age,name from tb_test where id = 101 union select age,name from tb_test where id = 102;
不建議采用的SQL語句(使用or)是:
- select age,name from tb_test where id = 101 or id = 102;
5.盡可能避免索引列在like的首字符使用通配符
例如,我們想要將表tb_test中name匹配“zho”的記錄中的id和age查找出來。
正確的SQL語句是:
- select id,age from tb_test where name like ‘zho%’;
不建議采用的SQL語句是:
- select id,age from tb_test where name like ‘%ho%’;
6.復合索引的使用
如果我們建立的索引是復合索引,那么必須使用到該索引中的***個字段作為條件時才能保證系統使用該索引。
例如,我們在表tb_test上新建了如下索引:
- create index idx4_tb_test on tb_test(id,name,addr);
以上索引idx4_tb_test相當于建立了index(id)、index(id,name)、index(id,name,addr) 這3個索引。在SQL語句的where條件中單獨使用name或addr時不會使用到該索引,必須使用id時才會使用到該索引。
總結
在我們編寫的SQL語句中,不正確地使用索引列可能會導致索引不被使用,而進行全表掃描,極大地降低了數據庫的性能。因此,學習正確的索引的使用方法實在是很有必要的。
但是,需要指出的是,本文中提到的數據庫索引的優化語句必須要在操作大量數據時才能顯示出效果。在編寫數據庫腳本之前,大家可以先評估一下系統的數據量,看是否有必要在SQL優化上花費大量的時間。
【本文是51CTO專欄作者周兆熊的原創文章,作者微信公眾號:周氏邏輯(logiczhou)】