mysql性能優化注意事項以及索引

                  mysql性能優化注意事項以及索引mysql

一:數據庫的優化方面sql

1商業需求的影響數據庫

好比說論壇裏的帖子統計,而且實時更新性能優化

從功能上來講經過命令   select  count*from 表名 能夠獲得結果,若是論壇每秒產生產生成千上萬條帖子,咱們沒有采用myisam存儲而用的是innodb存儲;就算再好的設備也不可能很快的查詢出來。數據結構

注:在wherecount*)使用中myisaminnodb要快的多;由於myisam內置了一個計數器,count*)能夠直接從計數器當中讀取,而innodb則要掃描全表。     架構

因此在innodb上執行count*)時通常伴隨where,並且where中要包含主鍵之外的索引列。ide

若是必需要實施更新就專門爲這個功能建立一個表,要想查詢結果就專門查看這個表就行了;到時候每秒產生的上萬條帖子也是一種麻煩,反過來講可是到底有多少人會關注這個實時更新,若是把實時更新去掉就很容易實現;在經過建立統計表,每隔必定的時間去刷新即可以。這就是不合理的商業要求。性能

2:系統架構以及實現的影響優化

1)二進制多媒體數據spa

主要包括圖片、視屏、其餘二進制文件,若是放到數據庫中數據空間資源消耗很是嚴重,另一個就是消耗主機的cpu資源,由於數據庫本就不是處理這些的優點,

解決辦法:能夠將這些二進制多媒體數據放到一個專門的文本文件中,而後給數據庫作一個鏈接指向這個文本文件,實現數據庫調用多媒體文件,有不用消耗數據庫的空間和cpu資源。

2)超大文本數據

若是大的文本數據放到數據庫當中也會形成空間的佔用浪費問題。

解決方法:可使用非關係型數據庫進行存儲

3)查詢語句對性能的影響

每一個sql語句在優化先後的性能差別也是各不相同

在數據庫管理軟件中,最大性能瓶頸就是在於磁盤io、也就是數據的存取操做上面,而對於同一份數據,當咱們以不一樣的方式去查找某一點內容時候,所需的讀取數據量可能會有天壤之別,搜消耗的資源也區別很大

首先進行編寫一個腳本插入20000行的數據

wKiom1k_4Xvyuz39AAEtFnYqw9A671.png-wh_50 

wKiom1k_4ZHzoSMzAAAMgJ3_Osg051.png-wh_50 

好比執行sql語句時能夠用explain來查看執行計劃:

 

wKioL1k_4cnxkiovAABZJLKSILs550.png-wh_50 

使用其餘方式再次查詢打開profiling功能,來查看sql的實際執行計劃

打開功能

wKiom1k_4d3CIzWNAAARMXU4rY4020.png-wh_50 

開始查詢

 

wKioL1k_4fLTucF7AAB1UAJtdF0215.png-wh_50 

wKioL1k_4nWSnj-BAAA6UnOpfyY455.png-wh_50 

查看profile對數據庫的cpublock,以及io的使用狀況:

wKioL1k_4oiBfpozAABUs1irruk160.png-wh_50 

 

4)數據庫的schema(模式)設計對性能也有影響

5)硬件選擇對性能的影響

數據庫主機是存儲數據的地方,因此io性能必需要優先考慮,不管是什麼數據庫都必須考慮的因素,固然和io相關的板卡

另外cpu的處理能力也不能忽視,企業中必須使用多核,另外內存也必需要大至少要64G

其實數據庫的優化不僅僅從物理方面進行提升配置,也包括邏輯化如鏈接數。。。,和商業的需求。總之就是系統架構最優化、邏輯結構精簡化、硬件設施理性化

 

 

2、索引的介紹以及建立和使用

 

什麼是索引?

索引(index) 是幫助mysql高效獲取數據結構,幫助dba快速定位,簡單來講就至關於字典中的目錄

索引的類型在上章講過有三種{B-TreeR-TreeFull-Tree}類型、最經常使用的是B-Tree

這裏主要介紹的是B-Tree的索引結構

wKioL1k_4qGifoL-AAOWM6ruWeM416.png-wh_50 

如圖:這裏只說重點、淺藍色的咱們成爲磁盤塊、能夠看到每一個磁盤塊包含幾個數據項,和指針(×××)其實真正的數據在葉子節點上,就是最下面的一層,而其餘的不存放數據,只存放指引數據方向的索引而已。

例如:要查找29,首先把磁盤塊1,加載到內存,發生一次io,在內存中用二分查找肯定291735之間,鎖定磁盤塊1p2指針,由此往下推算,直到第三層算出爲止。

 

索引的優勢:

mysql高效的運行,能夠大大提升mysql的查詢效率,數據約束,快速定位

使用索引的代價:

1)須要加載到內存,以文件的形式存放在硬盤中,因此增長磁盤的開銷

2)寫數據,須要更新索引,對數據庫是很大的開銷,下降表更新、添加和刪除的速度

 

不建議使用索引的狀況:

1)表記錄較少

2)索引的選擇性較低,指不重複的索引與表記錄數的比值,取值範圍(0-1),選擇性越高,索引價值越大

 

1:普通索引

最基本的索引,沒有任何限制

create index index_name on tablenamecolumm1column2,。。。。。】)

2:惟一索引

和普通索引相似,不一樣的就是索引列的值必須惟一,但容許空值,指的就是null,若是是組合索引,列的值必須惟一。

create table tablenameid int not null,username varchar(16) not null,primary key(id);

3:組合索引

爲了進一步提高mysql的效率,可使用組合索引

create index index_name on table_namecolumn1column2column3);

這樣的組合索引效率高於單列的索引,並且採用的是最左前綴的結果。簡單理解就是從最左邊開始組合。

4:全文索引

只用於myisam表對文本域進行索引。字段包括charvarchartext

 

不過切記大容量的數據表,生成全文索引是一個很是消耗時間和硬盤的作法

 

查看索引

show  index  from  table_name

show  keys  from  table_name

建立索引的時機:

通常在wherejoin子句中須要創建索引

使用索引的注意事項:

某些狀況下like 才須要創建索引,由於在一通配符%-開頭查詢時,mysql不會使用索引

select * from table-name where name like %admin’;

另外還有就是不能再列上進行運算

select * from users where YEAR(adddate)<2000;

強每一個行上進行運算,將致使索引失效而進行全表掃描

可修改成select * from users where adddate<2000-10-4;

總結:

索引的優化過程當中主要用於存在wherejoin子句當中

索引中的列的基數越大,索引的效果越好

使用的短索引,若是對字符串進行索引,應該指定一個前綴長度,可節省大量的索引空間,提高查詢的速度

相關文章
相關標籤/搜索