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:這個值越高,說明查詢低效。