日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql优化分析

發布時間:2025/3/15 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql优化分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、mysql性能下降的原因及對策

  • 數據過多–>分庫分表
  • 關聯了太多的表,太多join–>Sql優化
  • 沒有充分利用到索引–>利用索引
  • 服務器調優及各個參數設置–>調整my.cnf
    以下是7種join圖示:

二、索引優化

  • 什么是索引
    MySQL官方對索引的定義為:
  • 索引(Index)是幫助MySQL高效獲取數據的數據結構。可以得到索引的本質:索引是數據結構。

    索引的目的在于提高查詢效率,可以類比字典。

    如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然后從下往下找到y字母,再找到剩下的sql。如果沒有索引,那么你可能需要a----z,如果我想找到Java開頭的單詞呢?或者Oracle開頭的單詞呢?

    可以簡單理解成:排序好的快速查找數據結構,如下圖示:

    結論:數據本身之外,數據庫還維護著一個滿足特定查找算法的數據結構,這些數據結構以某種方式指向數據,這樣就可以在這些數據結構的基礎上實現高級查找算法,這種數據結構就是索引。而且,一般來說索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上

  • 索引的優勢
    類似大學圖書館建書目索引,提高數據檢索的效率,降低數據庫的IO成本。
    通過索引列對數據進行排序,降低數據排序的成本,降低了CPU的消耗。
  • 索引的劣勢
  • 1.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段,都會調整因為更新所帶來的鍵值變化后的索引信息
    2.實際上索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄,所以索引列也是要占用空間的。

  • mysql索引結構(B+樹)
    先看如果使用B樹的索引結構

    再看使用 B+樹建立索引的結構

    B樹和B+樹的對比
  • 聚簇索引與非聚簇索引
  • 聚簇索引并不是一種單獨的索引類型,而是一種數據存儲方式。術語‘聚簇’表示數據行和相鄰的鍵值聚簇的存儲在一起。
    如下圖,左側的索引就是聚簇索引,因為數據行在磁盤的排列和索引排序保持一致。

    聚簇索引的好處:

    按照聚簇索引排列順序,查詢顯示一定范圍數據的時候,由于數據都是緊密相連,數據庫不不用從多個數據塊中提取數據,所以節省了大量的io操作。

    聚簇索引的限制:

    1.對于mysql數據庫目前只有innodb數據引擎支持聚簇索引,而Myisam并不支持聚簇索引。
    2.由于數據物理存儲排序方式只能有一種,所以每個Mysql的表只能有一個聚簇索引。一般情況下就是該表的主鍵。
    3.為了充分利用聚簇索引的聚簇的特性,所以innodb表的主鍵列盡量選用有序的順序id,而不建議用無序的id,比如uuid這種。

    三、mysql索引分類

  • 單值索引:即一個索引只包含單個列,一個表可以有多個單列索引
  • 語法:

    隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name) ); 單獨建單值索引: CREATE INDEX idx_customer_name ON customer(customer_name); 刪除索引: DROP INDEX idx_customer_name on customer;
  • 唯一索引:索引列的值必須唯一,但允許有空值
    語法:
  • 隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name),UNIQUE (customer_no) ); 單獨建唯一索引: CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no); 刪除索引: DROP INDEX idx_customer_no on customer ;
  • 主鍵索引:設定為主鍵后數據庫會自動建立索引,innodb為聚簇索引
    語法:
  • 隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id) ); CREATE TABLE customer2 (id INT(10) UNSIGNED ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id) );單獨建主鍵索引: ALTER TABLE customer add PRIMARY KEY customer(customer_no); 刪除建主鍵索引: ALTER TABLE customer drop PRIMARY KEY ; 修改建主鍵索引: 必須先刪除掉(drop)原索引,再新建(add)索引
  • 復合索引:即一個索引包含多個列
    語法:
  • 隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name),UNIQUE (customer_name),KEY (customer_no,customer_name) ); 單獨建索引: CREATE INDEX idx_no_name ON customer(customer_no,customer_name); 刪除索引: DROP INDEX idx_no_name on customer ;
  • 基本語法:
  • 創建:

    CREATE [UNIQUE ] INDEX [indexName] ON table_name(column))

    刪除:

    DROP INDEX [indexName] ON mytable;

    查看:

    SHOW INDEX FROM table_name

    使用ALTER命令:

    有四種方式來添加數據表的索引: ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。

    四、哪些情況需要創建索引

    • 主鍵自動建立唯一索引
    • 頻繁作為查詢條件的字段應該創建索引
    • 查詢中與其它表關聯的字段,外鍵關系建立索引
    • 單鍵/組合索引的選擇問題, 組合索引性價比更高
    • 查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
    • 查詢中統計或者分組字段

    五、哪些情況不要創建索引

    • 表記錄太少
    • 經常增刪改的表或者字段
    • Where條件里用不到的字段不創建索引
      為什么:

    雖然提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。
    因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件

    • 過濾性不好的不適合建索引

    六、性能分析(explain:執行計劃)

  • 是什么
    使用EXPLAIN關鍵字可以模擬優化器執行SQL查詢語句,從而知道MySQL是
    如何處理你的SQL語句的。分析查詢語句或是表結構的性能瓶頸。
  • 能干嘛(主要是查看以下信息)
  • 1.表的讀取順序
    2.哪些索引可以使用
    3.數據讀取操作的操作類型
    4.哪些索引被實際使用
    5.表之間的引用
    6.每張表有多少行被物理查詢

  • 怎么使用
  • Explain + SQL語句

  • 各字段解釋
    參考
  • 總結

    以上是生活随笔為你收集整理的Mysql优化分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。