在项目开发中,页面的反应速度是很是重要的,改善页面反应速度的方法有不少。web
但通常的问题多数是出如今数据库访问的SQL上面。sql
好比:重复屡次访问数据库,SQL速度很低等。数据库
重复屡次访问数据库须要修改逻辑来减小数据库的访问。而SQL的执行速度能够经过仔细调试解决。网络
下面是一些SQL的性能调试方法.整理于网络内容。app
1. IN和EXISTS函数
--1.慢 SELECT name FROM Personnel WHERE birthday IN (SELECT birthday FROM Celebrities); --2.快 SELECT P.name FROM Personnel AS P WHERE EXISTS (SELECT FROM Clelebrities AS C WHERE P.birthday = C.birthday);
其中EXISTS (SELECT * FROM …)的写法比EXISTS (SELECT 列名 FROM …)的写法好。
性能
2. COUNT(*) 和 COUNT(列名)spa
COUNT(列名)较快.net
3. GROUP BY 使用index。调试
GROUP BY col1 若是不能使用index。 GROUP BY col1,col2可以使用index的话,改成 GROUP BY col1,col2。
4. ORDER BY 使用index。
和GROUP BY同理。
5. UNION、INTERSECT、EXCEPT 后面加上ALL 关键字
若是对重复数据不是很敏感的时候,在UNION、INTERSECT、EXCEPT 后面加上ALL 关键字后,性能会获得提高。
6. 下面的一些写法也会形成使用了index。
/* 1.index的col_1列有运算 */ SELECT * FROM SomeTable WHERE col_1 * 1.1 > 100;
这种状况改成 WHERE col_1 > 100/1.1便可。
WHERE col_1 IS NULL;
使用了is null的时候也是使用不了index的。这个时候能够作个函数index来解决。
WHERE SUBSTR(col_1, 1, 1) = 'a';
index的列使用了函数。这个时候能够作个函数index来解决。
WHERE col_1 <> 100;
使用了否认形式。 (<>, !=,NOT EQUAL, NOT IN)也是同样的。
好比经过 col_1 < 100 OR col_1 > 100这种变换的形式来解决。
WHERE col_1 > 100 OR col_2 = 'abc';
OR的时候最好改成in。 若是非要使用OR的话,追加bitmap index。
× SELECT * FROM SomeTable WHERE col_1 LIKE '%a'; × SELECT * FROM SomeTable WHERE col_1 LIKE '%a%'; ○ SELECT * FROM SomeTable WHERE col_1 LIKE 'a%';
Like的时候,只有前方一致可以使用index。
后方一致能够经过REVERSE转换后,改成前方一致就能够了。部分一致能够写个函数,追加函数index就能够了。
SELECT * FROM SomeTable WHERE col_1 = 10; SELECT * FROM SomeTable WHERE col_1 = '10'; SELECT * FROM SomeTable WHERE col_1 = CAST(10, AS CHAR(2));
col_1为char类型,类型不匹配的时候,不能使用index。改成类型一致。
○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100 AND col_3 = 500; ○ SELECT * FROM SomeTable WHERE col_1 = 10 AND col_2 = 100 ; × SELECT * FROM SomeTable WHERE col_1 = 10 AND col_3 = 500 ; × SELECT * FROM SomeTable WHERE col_2 = 100 AND col_3 = 500 ; × SELECT * FROM SomeTable WHERE col_2 = 100 AND col_1 = 10 ;
假设col_1, col_2, col_3 列上有index,若是顺序不对的话不能使用index。
rowid(Oracle)、oid(PostgreSQL)若是知道行号的话,行号访问最快。
× SELECT * FROM SomeTable; ○ SELECT col_1, col_2, col_3 FROM SomeTable;
最好只取须要的数据。这样能够减小零时表的大小,也能减小网络的通讯量。