mysql數據庫知識面試準備-優化篇

你對數據庫優化都有哪些經驗

1.對於數據庫存儲引擎來說

mysql我常用的存儲引擎有三種
MyiSAM存儲引擎
它是5.5之前的默認的存儲引擎,不支持事務,不支持外鍵,內存和硬盤空間佔用率低,訪問速度快
InnoDB存儲引擎
它是5.5之後默認的存儲引擎,支持事務.支持外鍵,提供行級鎖(就是使一些操作一次只能一個人進行),不過寫的處理效率比較低,會佔用更多的磁盤空間(保留數據和索引)
MEMORY存儲引擎(memory)
訪問的數據非常的快,默認使用的是HASH索引,不過,一旦數據庫服務重啓或者關閉了,表中的數據就會丟失.

大部分的情況下,選擇InnoDB引擎
對於日誌性的應用主要用來插入和查詢數據的時候,我會使用MyiSAM存儲引擎.因爲他開銷低,而且插入速度非常快.
在臨時存放數據,數據量不大,而且還不需要較高的數據安全性的時候我會使用Memory存儲引擎,因爲它的讀寫速度非常的快,

2.對於提高sql語句效率

在處理大批量插入數據時
大批量數據插入空表的時候,可以將存儲引擎設置爲MyISAM存儲引擎,並且通過disable keys將唯一索引關閉;
大批量數據插入非空Innodb表的時候
第一種辦法就是在導入數據的時候按照主鍵順序排列
第二種就是導入數據前關閉唯一性的效驗,導入後恢復(關閉唯一性的效驗:set UNIQUE_CHECKS=0);
第三種就是如果使用了自動提交,可以在導入前執行關閉自動提交,導入後恢復(SET AUTOCOMMIT=0);
對於優化INSERT語句來說
儘量使用多個值表的insert語句,降低連接,關閉的消耗;
還可以將索引文件和數據文件分放在的不同的磁盤上存放着
如果是一個文本文件裝入一個表時,使用LOAD DATA INFLIE ,比一般的insert的語句要快近20倍!
對於SELECT優化來說
可以儘量減少額外的排序,通過索引直接返回有序數據;
where條件和order by使用相同的索引,並且order by 的字段儘量都是升序或者降序;

還有就是能用關聯查詢的時候,就不要用子查詢
而對於包含or的查詢語句,如果要利用索引的話,則or
之間的每個條件必須都用到索引,否則應該考慮給他們增加索引了
如果是優化分頁
1.可以在索引上完成排序分頁的操作,然後根據主鍵關聯回原表查詢所需要的其他列,比如
select a.name, a.description from person a innner join(select pid from person order by birthdat limit 50,5)
2.也可以把limit查詢轉換爲某個位置的查詢
比如
select a.name, a.description from person where pid>7788 order by birthday limit 50,5

而對於已經知道只有一條查詢的數據時,可以在後面加上limit 1增加查詢效率;
並不是使用索引就一定會提高效率,也有不使用索引的情況
比如:
1…用or分隔開的條件,如果or前的條件中的列有索引,而後面的列沒有索引,那麼涉及到的索引都不會被用到
2…對於複合索引,如果索引列不是複合索引的第一部分,那麼也不用索引(也就是不符合最左前綴)
3…如果like是以"%"開始的,那麼該列上的索引也不會被使用到.
4…如果列是字符串的話,where條件中必須將字符常量值加上引號,否則即使該列上存在索引,也不會使用
5.像not in, not exists, <, >, != 這些操作符都不走索引
還有一個需要注意的就是
不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統也有可能無法正確使用索引;
explain命令
我們一般可以通過explain命令來獲取到mysql是如何執行select語句的信息的,像select語句在執行的過程中,表是如何連接的,聯繫的順序怎麼樣;
我們優化的目標
一是每個查詢都要使用索引以提高查詢效率,至少達到range級別,最好能達到ref;
range就是索引範圍掃描
ref就是非唯一性索引掃描,返回匹配某個單獨值的所有行。
二是追求key_len和rows最小;
key_len表示的是索引中使用的字節數
rows是根據表統計的信息及索引選用情況.大致估算出找到所需的記錄,所需要讀取的行數;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章