mysql數據庫優化大方向

優化主要有下幾個方面:
1:合理建表(至少達到3NF)
2:建立索引(普通索引,主鍵索引,唯一索引,全文索引)
3:分表技術(水平分割和垂直分隔)
4:讀寫分離
5:存儲過程(模塊化編程可提高速度)
6:對mysql配置優化(最大連接併發數和緩存大小)
7:mysql服務器硬件升級
8:定時清除不需要的數據,定時碎片整理(尤其是MyISAM)


詳解如下


一:
1NF數據表中的每一列都是不可分隔的
只要是關係新數據庫都滿足1NF
2NF數據表中的記錄都是唯一的。一般使用設置一個沒有業務邏輯的主鍵。這樣就很穩定,一般不會修改。
3NF不含冗餘數據列,存在多個數據表時,如果能夠推導出來的信息就不要用單獨的列存放。
《反3NF : 但是,沒有冗餘的數據庫未必是最好的數據庫,有時爲了提高運行效率,
就必須降低範式標準,適當保留冗餘數據。具體做法是: 在概念數據模型設計時
遵守第三範式,降低範式標準的工作放到物理數據模型設計時考慮。降低範式就
是增加字段,允許冗餘。》
二:
SQL語句
使用show status like '……'可以查詢mysql數據庫在運行時的一些狀態信息

如:
show status like 'uptime'  該服務開啓時間
show status like 'com_select'/'com_insert'/'com_delete'/'com_update'執行次數
show status like 'connections'查詢連接數‘slow_queries’查詢慢查詢次數
也可以在status前面加上global即整個服務及的查詢或session
是會話級別的查詢即一個控制檯窗口。當然有一些不需要繪畫級別的查詢,如連接數等
默認情況下,mysql認爲10秒纔是一個慢查詢.,可以修改
show variables like ‘long_query_time’ ; //可以顯示當前慢查詢時間
set long_query_time=1 ;//可以修改慢查詢時間

建立索引

查詢表的索引: 

show index from tablename(\G)
show keys from tablename或desc tablename
my.ini中#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
給目錄下的temp文件夾下都有每一個數據表對應的frm後綴的文件即表結構。MYD數據MYI索引。
由於mysql數據庫存儲引擎的不同索引的存儲方式有所區別
MyISAM允許的索引類型爲::BTREE
InnoDB爲::BTREE
MEMORY/HEAP::HASH或BTREE

建立主鍵索引::在建表時建立表及索引或行及索引,也可以在建表後建立索引alter table tb add primary key(id)
建立普通索引::在建表後面建立普通索引create index indexName on table(列1,列2)
建立唯一索引::可以建表時寫列級唯一索引,還可以在建表後create unique index indexName on table(列1)
該種索引可以爲空或不填。
建立全文索引::只對數據庫引擎爲MyISAM的數據庫可用。mysql自己提供的fulltext針對英文生效->sphinx (coreseek) 技術處理中文
建立表級索引FULLTEXT(title名,body字段)查詢時select body from tbname where match(title,body) against('yanayn')
全文索引一個 叫 停止詞,  因爲在一個文本中,創建索引是一個無窮大的數,因此,
對一些常用詞和字符,就不會創建,這些詞,稱爲停止詞.select  match(title,body)against
(‘database’);查詢該字段在裏面出現的可能性。

索引像數據庫一樣不提供修改,必須先刪除在創建。
刪除索引:alert table tbname drop index indexname
對於主鍵可以alert table tbname drop primary key.
如果主鍵自己有auto_increment屬性。那麼必須先把該屬性改掉。
alert table tbname change id int(6);然後在alert drop即可。否則刪除不掉。

數據表的引擎是MyISAM或INNODB時,當執行dml語句時,會重整二叉樹,在一定程度上耗時間,
索引本生也會佔據磁盤空間。所以建立索引時需謹慎。建立索引的依據是:::::

1較頻繁查詢的字段建立索引2唯一性太差的不適合建立單獨索引,更新頻繁的也不適合
不會出現在where裏面的字段也不適合建立索引。

使用索引時需要注意::

 explain 可以幫助我們在不真正執行某個sql語句時,就執行mysql怎樣執行,這樣利用我們去分析sql指令.

1, 對於創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用

explain select * from dept where loc='aaa'\G

就不會使用到索引

 

2,對於使用like的查詢,查詢如果是  %aaa不會使用到索引

       ‘aaa%’會使用到索引。

 

比如: explainselect * from dept where dname like '%aaa'\G

不能使用索引,即,在like查詢時,關鍵的 ‘關鍵字’ , 最前面,不能使用 % 或者 _這樣的字符., 如果一定要前面有變化的值,則考慮使用全文索引->sphinx.

 

3.     如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有字段,都必須建立索引, 我們建議大家儘量避免使用or關鍵字

 

select * fromdept where dname=’xxx’ or loc=’xx’ or deptno=45

 

4.      如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則不使用索引。(添加時,字符串必須’’), 也就是,如果列是字符串類型,就一定要用 ‘’ 把他包括起來.

 

5.      如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

show status like‘Handler_read%’;

大家可以注意:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。  handler_read_rnd_next:這個值越高,說明查詢低效。


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