mysql索引

實現效果:通俗的說索引是用來提升查詢效率,不須要經過掃描所有表記錄,而直接使用索引快速定位須要查詢的值。mysql

需求的影響:論壇帖子要求總量的統計,附加要求,實時更新
ios

        功能上很是容易實現,執行select count * from 表名 的query就能夠獲得結果,若是咱們採用不是MyLSAM存儲引擎,而是使用Innodb的存儲引擎,那麼存放帖子的表有上千萬條記錄,執行這條須要很大的成本。
web

        沒有where的count使用MyLSAM要比InnoDB快的多,由於MyLSAM內置了一個計時器,count時他直接從計數器中讀,1而InnoDB必須掃描全表。在InnoDB上執行count是通常要伴隨where,且where重要包含主鍵之外的索引列。
sql

        這樣查詢不行,咱們就專門爲這個功能建一個表,就只有一個字段,一條記錄,就存放這個統計量,每次有新的帖子產生的時候,都將這個值增長1,咱們每次都只須要查詢這個表就能夠獲得結果,效率就能知足要求。查詢效率確定可以知足要求,開始若是帖子產生快,高峯時期能夠每秒上百個新增操做。由於鎖資源爭用嚴重形成總體性能的大幅度降低。
數據庫

        經過建立一個統計表,而後經過一個定時任務每隔必定時間段去更新一次裏面的統計值,既能夠解決統計值查詢的效率問題,有保證不影響新發帖的效率。
性能優化

     系統架構及實現的影響
服務器

            全部數據都不是適合在數據庫存放。
網絡

                二進制多媒體數據:主要包括圖片,音頻,視頻和其餘一些相關的二進制文件,將二進制多媒體數據存放在數據庫中,數據庫空間只有消耗嚴重,數據存儲消耗數據庫主機的CPU資源。
mysql優化

                超大文本數據
數據結構

                    在5.0.3以前的mysql版本,VARCHAR類型的數據最長只能存放255個字節,若是須要存儲更長的數據到一個字段,必須使用TEXT類型(最大可存放64k)的字段,甚至是更大的LONGTEXT類型(最大4GB)。而text類型數據的處理性能要遠比VARCHAR類型數據的處理性能底下不少。從5.0.3版本,VARCHAR類型的最大長度被調整到64kb了,因此,超大文本數據存放的數據庫綜合那個不只會帶來性能低下,還帶來空間佔用浪費。

                對於web應用,活躍數據的數據量老是不會特別大,有些活躍數據更是不多變化,對於這裏數據,若是咱們能將變化相對較少的部分活躍數據經過應用層的cache機制cache到內存中,對性能提高確定是成數量級的,並且因爲是活躍數據,對系統總體的性能影響也會很大。

                查詢語句對性能的影響

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

                explain來查看執行計劃

                profiling來查看實際執行計劃

                    經過執行show PROFILE命令獲取當前系統中保存的多個query的profile的概要信息。

            數據庫Schema設計對性能的影響

            硬件選擇對性能的影響

                數據庫主機是存取數據的地方,數據庫主機的io性能確定是須要最優先考慮的一個因素,無論什麼類型的數據庫應用都適用。在主機中決定io性能不只主要有磁盤和內存所決定,固然也包括各類io相關的板卡

                其次,數據庫主機是存取數據的地方,詞語要相對集中不少,單臺主機上所須要進行的計算量天然也就比較多,全部數據庫主機的CPU處理能力也不能忽視

                數據庫負責數據的存儲,與各應用茨城縣的交互中傳遞的數據比其餘各種服務器都要多,因此數據庫主機的網絡設備的性能也可能會成爲系統的瓶頸。

                數據庫應用系統的優化,其實是一個須要多方面配合,多方面優化的才能產生根本性改善的事情。

                能夠經過商業需求合理化,系統架構最優化,邏輯實現荊建華,硬件設施理性化。

                mysql性能優化之一-索引

                    mysql索引的好處:對於沒有索引的表,單表查詢可能幾十萬數據的瓶頸,而一般大型網站單日就會產生幾百萬的數據,沒有索引查詢會變得很是緩慢。

                索引實在存儲引擎中實現的,而不是在服務器層中實現的。每種存儲的索引都不必定徹底相同,並非全部的存儲引擎都支持全部的索引類型。

                什麼是索引:

                    是幫助mysql高興獲取數據的數據結構,他的存在形式是文件,縮影可以幫助咱們快速定位數據。

                爲何使用索引:

                    索引可讓mysql高效運行,能夠提升mysql的插敘效率,數據約束

                好處:

                    提升查詢效率,快速定位數據

                索引產生的代價:

                    1,自己以文件形式存放在硬盤,須要的時候才加載至內存,全部添加索引會增長磁盤的開銷;

                    2,寫數據:須要更新索引,歲數據庫是不少的開銷,見底表更新,添加和刪除的速度。

                不建議使用索引的狀況有哪些:

                    表記錄少

                    索引的選擇性較低。指不重複的索引值與表記錄數的比值,取值範圍0到1,值越大,選擇性越大

                索引的類型:

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

                        create index index_name on tablename(column1)

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

                        create uniaue table_name on tablename(column1)

                    主鍵索引,一種特殊的惟一索引,不容許有空值,通常在建表的時候同時創建主鍵索引

                        create table table_name(id int not unll,username varchar(16) not null,primay key(id));

                    組合索引,創建單列索引,表明有3個單列索引,查詢時和上述的組合索引效率也會大不同,遠遠低於組合索引。

                    全文索引,只用於mylsam表,對文本域進行索引,字段類型包括char,varchar,text,不過對於大容量的數據表,生成全文索引是一個很是消耗時間硬盤空間的作法

                        create fulltext index index_name on tablename(column)

                索引的數據結構,B-tree索引結構:

        wKioL1jCYtWwYID7AAJC5VHHhOw332.png-wh_50

                如上圖,是一顆b+樹,這裏只說一些重點,淺藍色的塊咱們稱之爲一個磁盤塊,能夠看到每一個磁盤塊包含幾個數據項(深藍色所示)和指針(×××所示),如磁盤塊1包含數據項1735,包含指針P1P2P3P1表示小於17的磁盤塊,P2表示在1735之間的磁盤塊,P3表示大於35的磁盤塊。真實的數據存在於葉子節點即3591013152829366075799099。非葉子節點只不存儲真實的數據,只存儲指引搜索方向的數據項和指針,如1735並不真實存在於數據表中。

b+樹的查找過程

                如圖所示,若是要查找數據項29,那麼首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找肯定291735之間,鎖定磁盤塊1P2指針,內存時間由於很是短(相比磁盤的IO)能夠忽略不計,經過磁盤塊1P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO292630之間,鎖定磁盤塊3P2指針,經過指針加載磁盤塊8到內存,發生第三次IO,同時內存中作二分查找找到29,結束查詢,總計三次IO。真實的狀況是,3層的b+樹能夠表示上百萬的數據,若是上百萬的數據查找只須要三次IO,性能提升將是巨大的,若是沒有索引,每一個數據項都要發生一次IO,那麼總共須要百萬次的IO,顯然成本很是很是高。

               有什麼要求:只有某些時候的like才需創建索引,由於在以通配符%和_開頭作查詢時,mysql不會使用索引。

                不要在列上進行運算

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

                選擇索引列:

                    a,使用索引的主要有兩種類型的列:在where子句中出現的列,在join子句中出現的列

                    b,考慮列綜合那個值的分佈,若是對字符串列進行索引,應該指定一個前綴長度,可節省大量索引空間,提高查詢速度。

                    c,使用短索引,可節省大量索引空間,提高查詢速度。

                    d,利用最左前綴

                    e,不要過分索引,值保持所需的索引,每一個額外的索引都要佔用額外的磁盤空間,並下降寫操做的性能,在修改表的內容時,索引必須進行更新,有時可能須要重構,所以,索引越多,所花的時間越長。


                 mysql性能優化-慢查詢分析,優化索引,優化配置

                    性能瓶頸定位

                        show命令

                        慢查詢日誌

                        explain分析查詢

                        profiling分析查詢

                    索引即查詢優化

                    配置優化

                        最多見的兩個瓶頸是cpu和i/o的瓶頸,cpu在飽和的時候通常發生子數據裝入內存或從磁盤上讀取數據時候,磁盤i/o瓶頸發生在裝入數據遠大雨內存容量的時候,若是應用分佈在網絡上,查詢量至關大的時候那麼瓶頸就會出如今網絡上,能夠用mpstat,iostat,sar,vmstat來查看系統的性能狀態。

                    查詢與索引優化分析

                            優化mysql時,須要分析數據庫。有慢查詢日誌,explain分析查詢,profiling分析以及show命令查詢系統狀態即系統變量,經過定位分析性能的瓶頸,才能更好的優化數據庫系統的性能。

                    show命令查看mysql狀態即變量,找到系統的瓶頸。

                        查看mysql服務器配置信息mysql > show variables;

                        查看mysql服務器運行的各自狀態值mysq > show global status;

                        mysqladmin variables -u username -ptanhong 顯示系統變量

                        mysqladmin extended-status -u username -ptanhong 顯示狀態信息

                     慢查詢日誌開啓。

                        配置文件my.cnf中的{mysqld}一行下面加入3個配置參數,並重啓mysql服務

                            show query log = 1    1:開啓 0:關閉

                            show_query_log_file = /usr/local/mysql/data/slow-query.log    慢查詢日誌存放地點

                           long_query_time = 1    表示查詢超過1秒才記錄

                使用mysqldumpslow命令能夠很是明確的獲得各類咱們須要的查詢語句,對mysql查詢語句的監控,分析,優化是mysql優化很是重要的,開啓慢查詢日誌後,日誌記錄操做,在必定程度上會佔用cpu資源影響mysql的性能,可是能夠階段性開啓來定位性能瓶頸

                explain分析查詢,能夠模擬優化器執行sql查詢語句,從而知道mysq是如何醋栗sql語句的,能夠分析你的查詢語句或是表結構的性能瓶頸

                    explain select * from test1.tb1 where stuname='admin'\G;

                        id:1 

               select_type:SIMPLE

                     table:tb1            顯示是哪一個表

                partitions:NULL           

                      type:ALL            插敘使用了何種類型,重要字段。

             possible_keys:NULL           顯示可能應用在表中的索引

                       key:NULL           實際使用的索引

                   key_len:NULL           使用的索引的長度

                       ref:NULL           顯示索引哪一列被使用

                      rows:19986          mysql認爲必須檢索返回請求數據的行數

                  filtered:10.00          

                     Extra:Using where    關於mysql模擬優化器執行sql語句來看是沒有使用索引查詢的,而是全表掃描

                1 row in set,1 warning(0.00 sec)

                profiling分析查詢

                    經過慢日誌查詢能夠知道哪些sql語句執行效率低下,經過explain能夠得知sql語句的具體執行狀況,索引使用等,能夠結合show命令查看執行狀態,若是決定explain的信息不夠詳細,能夠經過profiling命令獲得更準確的sql執行消耗資源的信息。

                    profiling默認是關閉的,經過set profiling=1開啓,執行須要測試的sql語句。

相關文章
相關標籤/搜索