不管用什麼樣的語言,資料庫是必不可少的,因此資料庫優化是必備的。
下面列舉幾條基本的簡單的資料庫優化,環境是php + mysql。
大家都知道資料庫中的表越小,在它上面執行的查詢也就會越快。因此合理設定字段屬性,使資料庫表盡可能小點,是最簡單的資料庫優化了。
(1)越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和cpu快取中都需要更少的空間,處理起來更快。
(2)簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更複雜。在mysql中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整型資料型別儲存ip位址。
(3)盡量避免null:應該指定列為not null,除非你想儲存null。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、乙個特殊的值或者乙個空串代替空值。
子查詢
insert into t1(a1) select b1 from t2 where not exists(select 1 from t1 where t1.id = t2.r_id);
join
insert into t1(a1)
select b1 from t2
left join (select distinct t1.id from t1 ) t1 on t1.id = t2.r_id
where t1.id is null;
儘管sql語句越少,執行速度越快,但是有些時候,並不是一跳sql語句可以搞定的。比如說,某****付款完成要先扣餘額,然後訂單狀態成功,但是如果扣完錢了,資料庫突然崩潰,訂單狀態沒改,這就會出現很嚴重的問題。
下面介紹一下thinkphp的事務。
$order = m(『order』);
$alladded = true; //先設定乙個值為 true;
$data['name'] = 'winter';
$order->starttrans(); //開啟事物
for($i = 1;$i<3;$i++)
}//回滾
if($alladded)else
如果commit了。那麼就提交插入資料。如果發現alladded為假說明有條資料沒插入正確。那麼就rollback回滾就會取消事物開啟之後運算元據庫的所有行為。
索引對查詢的速度有著至關重要的影響,理解索引也是進行資料庫效能調優的起點。
索引是儲存引擎用於快速查詢記錄的一種資料結構,通過合理的使用資料庫索引可以大大提高系統的訪問效能,接下來主要介紹在mysql資料庫中索引型別,以及如何建立出更加合理且高效的索引技巧。
mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引
primary key(主鍵索引) alter table `table_name` add primary key ( `col` )
unique(唯一索引) alter table `table_name` add unique (`col`)
index(普通索引) alter table `table_name` add index index_name (`col`)
fulltext(全文索引) alter table `table_name` add fulltext ( `col` )
組合索引 alter table `table_name` add index index_name (`col1`, `col2`, `col3` )
絕大多數情況下,使用索引可以提高查詢的速度,但如果sql語句使用不恰當的話,索引將無法發揮它應有的作用。下面是應該注意的幾個方面。首先,最好是 在相同型別的字段間進行比較的操作。在mysql 3.23版之前,這甚至是乙個必須的條件。例如不能將乙個建有索引的int欄位和bigint欄位進行比較;但是作為特殊的情況,在char型別的字段和 varchar型別欄位的字段大小相同的時候,可以將它們進行比較。其次,在建有索引的字段上盡量不要使用函式進行操作。
例如,在乙個date型別的字段上使用yeae()函式時,將會使索引不能發揮應有的作用。所以,下面的兩個查詢雖然返回的結果一樣,但後者要比前者快得多。
select
*
from
order
where
year
(orderdate)<2001;
select
*
from
order
where
orderdate<
"2001-01-01"
;
同樣的情形也會發生在對數值型字段進行計算的時候:
select
*
from
inventory
where
amount/7<24;
select
*
from
inventory
where
amount<24*7;
上面的兩個查詢也是返回相同的結果,但後面的查詢將比前面的乙個快很多。第三,在搜尋字元型字段時,我們有時會使用 like 關鍵字和萬用字元,這種做法雖然簡單,但卻也是以犧牲系統效能為代價的。例如下面的查詢將會比較表中的每一條記錄。
select
*
from
books
where
name
like
"mysql%"
但是如果換用下面的查詢,返回的結果一樣,但速度就要快上很多:
select
*
from
books
where
name
>=
"mysql"
and
name
<
"mysql"
最後,應該注意避免在查詢中讓mysql進行自動型別轉換,因為轉換過程也會使索引變得不起作用。
資料庫優化 資料庫設計優化
一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...
資料庫引擎優化顧問優化資料庫
現在一直在做的專案,資料量相對也不小,開始的時候沒有覺得,因為是剛開始,資料量還很小,在程式使用過程中速度還挺快,但是隨著資料量的不停的增長,發現程式越來越慢,甚至出現了超時的問題,因此要對程式和資料庫進行優化,前期專案比較緊,沒有針對大資料量業務進行分析設計,所以索引等相關優化沒有做到位,通過後期...
資料庫的優化
1.對查詢進行優化,要盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is null 不要以為 ...