資料庫優化之SQL優化

2021-09-11 08:36:41 字數 2802 閱讀 3926

sql優化

在我們書寫sql語句的時候,其實書寫的順序、策略會影響到sql的效能,雖然實現的功能是一樣的,但是它們的效能會有些許差別。

①選擇最有效率的表名順序

資料庫的解析器按照從右到左的順序處理from子句中的表名,from子句中寫在最後的表將被最先處理

在from子句中包含多個表的情況下:

如果三個表是完全無關係的話,將記錄和列名最少的表,寫在最後,然後依次類推

也就是說:選擇記錄條數最少的表放在最後

如果有3個以上的表連線查詢:

如果三個表是有關係的話,將引用最多的表,放在最後,然後依次類推。

也就是說:被其他表所引用的表放在最後

例如:查詢員工的編號,姓名,工資,工資等級,部門名

emp表被引用得最多,記錄數也是最多,因此放在form字句的最後面

select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname

from salgrade,dept,emp

where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)

②where子句中的連線順序

資料庫採用自右而左的順序解析where子句,根據這個原理,表之間的連線必須寫在其他where條件之左,那些可以過濾掉最大數量記錄的條件必須寫在where子句的之右。

emp.sal可以過濾多條記錄,寫在where字句的最右邊

select emp.empno,emp.ename,emp.sal,dept.dname

from dept,emp

where (emp.deptno = dept.deptno) and (emp.sal > 1500)

③select子句中避免使用*號

我們當時學習的時候,「*」號是可以獲取表中全部的字段資料的。

但是它要通過查詢資料字典完成的,這意味著將耗費更多的時間

使用*號寫出來的sql語句也不夠直觀。

④用truncate替代delete

這裡僅僅是:刪除表的全部記錄,除了表結構才這樣做。

delete是一條一條記錄的刪除,而truncate是將整個表刪除,保留表結構,這樣比delete快

⑤多使用內部函式提高sql效率

例如使用mysql的concat()函式會比使用||來進行拼接快,因為concat()函式已經被mysql優化過了。

⑥使用表或列的別名

如果表或列的名稱太長了,使用一些簡短的別名也能稍微提高一些sql的效能。畢竟要掃瞄的字元長度就變少了。。。

⑦多使用commit

comiit會釋放回滾點…

⑧善用索引

索引就是為了提高我們的查詢資料的,當表的記錄量非常大的時候,我們就可以使用索引了。

⑨sql寫大寫

我們在編寫sql 的時候,官方推薦的是使用大寫來寫關鍵字,因為oracle伺服器總是先將小寫字母轉成大寫後,才執行

⑩避免在索引列上使用not

因為oracle伺服器遇到not後,他就會停止目前的工作,轉而執行全表掃瞄

①①避免在索引列上使用計算

where子句中,如果索引列是函式的一部分,優化器將不使用索引而使用全表掃瞄,這樣會變得很慢

①②用 >= 替代 >

低效:

select * from emp where deptno > 3   

--首先定位到deptno=3的記錄並且掃瞄到第乙個dept大於3的記錄

高效:

select * from emp where deptno >= 4  

直接跳到第乙個dept等於4的記錄

①③用in替代or

select * from emp where sal = 1500 or sal = 3000 or sal = 800;

select * from emp where sal in (1500,3000,800);

①④總是使用索引的第乙個列

如果索引是建立在多個列上,只有在它的第乙個列被where子句引用時,優化器才會選擇使用該索引。 當只引用索引的第二個列時,不引用索引的第乙個列時,優化器使用了全表掃瞄而忽略了索引

create index emp_sal_job_idex

on emp(sal,job);

----------------------------------

select *

from emp

where job != 'sales';

上邊就不使用索引了。

資料庫結構優化

1)正規化優化: 比如消除冗餘(節省空間。。)

2)反正規化優化:比如適當加冗餘等(減少join)

3)拆分表: 垂直拆分和水平拆分

資料庫效能優化之SQL優化

優化目標 減少 io 次數 io永遠是資料庫最容易瓶頸的地方,這是由資料庫的職責所決定的,大部分資料庫操作中超過90 的時間都是 io 操作所占用的,減少 io 次數是 sql 優化中需要第一優先考慮,當然,也是收效最明顯的優化手段。降低 cpu 計算 除了 io 瓶頸之外,sql優化中需要考慮的就...

sql優化,資料庫優化

1.sql的執行順序 from 表名 where 條件 執行順序是從後往前,where條件後面的語句盡可能縮短where 資料執行的範圍。先group by 後order by select 查詢 2.避免過多的聯查,設計合理的表關係 3.遵守常見sql規範,盡可能減少 4.如果表字段過多,經常展示...

sql優化 資料庫優化

資料庫優化 資料庫優化吧我覺應該從硬碟 記憶體和網路頻寬考慮,提高硬碟的讀寫速度,增大頻寬提高吞吐量,增大伺服器記憶體,可以採用讀寫分離,降低單台資料庫的訪問壓力,查詢的時候控制資料量的大小,返回更少資料,減少互動次數,減少cpu及記憶體的開銷,sql優化 如果乙個表中資料量過大我們可以採用橫切割,...