mysql性能優化注意事項以及索引mysql
一:數據庫的優化方面sql
1商業需求的影響數據庫
好比說論壇裏的帖子統計,而且實時更新性能優化
從功能上來講經過命令 select count(*) from 表名 能夠獲得結果,若是論壇每秒產生產生成千上萬條帖子,咱們沒有采用myisam存儲而用的是innodb存儲;就算再好的設備也不可能很快的查詢出來。數據結構
注:在where和count(*)使用中myisam比innodb要快的多;由於myisam內置了一個計數器,count(*)能夠直接從計數器當中讀取,而innodb則要掃描全表。 架構
因此在innodb上執行count(*)時通常伴隨where,並且where中要包含主鍵之外的索引列。ide
若是必需要實施更新就專門爲這個功能建立一個表,要想查詢結果就專門查看這個表就行了;到時候每秒產生的上萬條帖子也是一種麻煩,反過來講可是到底有多少人會關注這個實時更新,若是把實時更新去掉就很容易實現;在經過建立統計表,每隔必定的時間去刷新即可以。這就是不合理的商業要求。性能
2:系統架構以及實現的影響優化
1)二進制多媒體數據spa
主要包括圖片、視屏、其餘二進制文件,若是放到數據庫中數據空間資源消耗很是嚴重,另一個就是消耗主機的cpu資源,由於數據庫本就不是處理這些的優點,
解決辦法:能夠將這些二進制多媒體數據放到一個專門的文本文件中,而後給數據庫作一個鏈接指向這個文本文件,實現數據庫調用多媒體文件,有不用消耗數據庫的空間和cpu資源。
2)超大文本數據
若是大的文本數據放到數據庫當中也會形成空間的佔用浪費問題。
解決方法:可使用非關係型數據庫進行存儲
3)查詢語句對性能的影響
每一個sql語句在優化先後的性能差別也是各不相同
在數據庫管理軟件中,最大性能瓶頸就是在於磁盤io、也就是數據的存取操做上面,而對於同一份數據,當咱們以不一樣的方式去查找某一點內容時候,所需的讀取數據量可能會有天壤之別,搜消耗的資源也區別很大
首先進行編寫一個腳本插入20000行的數據
好比執行sql語句時能夠用explain來查看執行計劃:
使用其餘方式再次查詢打開profiling功能,來查看sql的實際執行計劃
打開功能
開始查詢
查看profile對數據庫的cpu,block,以及io的使用狀況:
4)數據庫的schema(模式)設計對性能也有影響
5)硬件選擇對性能的影響
數據庫主機是存儲數據的地方,因此io性能必需要優先考慮,不管是什麼數據庫都必須考慮的因素,固然和io相關的板卡
另外cpu的處理能力也不能忽視,企業中必須使用多核,另外內存也必需要大至少要64G
其實數據庫的優化不僅僅從物理方面進行提升配置,也包括邏輯化如鏈接數。。。,和商業的需求。總之就是系統架構最優化、邏輯結構精簡化、硬件設施理性化
2、索引的介紹以及建立和使用
什麼是索引?
索引(index) 是幫助mysql高效獲取數據結構,幫助dba快速定位,簡單來講就至關於字典中的目錄
索引的類型在上章講過有三種{B-Tree、R-Tree、Full-Tree}類型、最經常使用的是B-Tree
這裏主要介紹的是B-Tree的索引結構:
如圖:這裏只說重點、淺藍色的咱們成爲磁盤塊、能夠看到每一個磁盤塊包含幾個數據項,和指針(×××)其實真正的數據在葉子節點上,就是最下面的一層,而其餘的不存放數據,只存放指引數據方向的索引而已。
例如:要查找29,首先把磁盤塊1,加載到內存,發生一次io,在內存中用二分查找肯定29在17和35之間,鎖定磁盤塊1的p2指針,由此往下推算,直到第三層算出爲止。
索引的優勢:
讓mysql高效的運行,能夠大大提升mysql的查詢效率,數據約束,快速定位
使用索引的代價:
1)須要加載到內存,以文件的形式存放在硬盤中,因此增長磁盤的開銷
2)寫數據,須要更新索引,對數據庫是很大的開銷,下降表更新、添加和刪除的速度
不建議使用索引的狀況:
1)表記錄較少
2)索引的選擇性較低,指不重複的索引與表記錄數的比值,取值範圍(0-1),選擇性越高,索引價值越大
1:普通索引
最基本的索引,沒有任何限制
create index index_name on tablename(columm1【column2,。。。。。】)
2:惟一索引
和普通索引相似,不一樣的就是索引列的值必須惟一,但容許空值,指的就是null,若是是組合索引,列的值必須惟一。
create table tablename(id int not null,username varchar(16) not null,primary key(id));
3:組合索引
爲了進一步提高mysql的效率,可使用組合索引
create index index_name on table_name(column1,column2,column3);
這樣的組合索引效率高於單列的索引,並且採用的是最左前綴的結果。簡單理解就是從最左邊開始組合。
4:全文索引
只用於myisam表對文本域進行索引。字段包括char、varchar、text
不過切記大容量的數據表,生成全文索引是一個很是消耗時間和硬盤的作法
查看索引
show index from table_name
show keys from table_name
建立索引的時機:
通常在where和join子句中須要創建索引
使用索引的注意事項:
某些狀況下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;
總結:
索引的優化過程當中主要用於存在where和join子句當中
索引中的列的基數越大,索引的效果越好
使用的短索引,若是對字符串進行索引,應該指定一個前綴長度,可節省大量的索引空間,提高查詢的速度