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

歡迎訪問 生活随笔!

生活随笔

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

数据库

MySQL数据库的优化

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

目錄

  • MySQL優化
  • 數據庫的表設計
  • explain關鍵字作用
  • 優化措施
  • 表的分割
  • 數據庫優化方案
  • 數據庫怎么優化查詢效率

MySQL優化

mysql為何要進行優化:

  • 系統的吞吐量瓶頸往往出現在數據庫的訪問速度上
  • 隨著應用程序的運行,數據庫的中的數據會越來越多,處理時間會相應變慢
  • 為了避免慢查詢的出現

mysql優化是一個綜合性的技術,主要包括:

  • 表的是設計合理化(符合 3范式)
  • 添加適當的索引(index)[四種:普通索引,主鍵索引,唯一索引,unique,全文索引]
  • 分表技術(水平分割,垂直分割)
  • 讀寫:[update/delete/add]分離
  • 存儲過程[模塊化編程,可以提高速度]
  • 對mysql配置優化[配置最大并發數,my.ini調整緩存大小]
  • Mysql服務器引薦升級
  • 定時的清理不需要的數據,定時進行碎片整理

要保證數據庫的效率,要做好以下四個方面的工作

  • 數據庫設計
  • sql語句優化
  • 數據庫參數配置
  • 恰當的硬件資源和操作系統
  • 此外,使用適當的存儲過程,也能提升性能,這個順序也表現了這四個工作對性能影響的大小

數據庫的表設計

通俗地理解三個范式第一范式: 1NF是對屬性的原子性約束,要求屬性()具有原子性,不可再分解;(只要是關系型數據庫都滿足1NF)第二范式: 2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;第三范式: 3NF是對字段冗余性的約束,它要求字段沒有冗余。 沒有冗余的數據庫設計可以做到。第一范式(1NF)1. 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只要數據庫是關系型數據庫(mysql/oracle/db2/informix/sysbase/sql server),就自動的滿足1NF。2. 數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。3. 如果實體中的某個屬性有多個值時,必須拆分為不同的屬性 。通俗理解即一個字段只存儲一項信息。第二范式(2NF)1、要求數據庫表中的每個實例或行必須可以被惟一地區分。為實現區分通常需要我們設計一個主鍵來實現(這里的主鍵不包含業務邏輯)。第三范式(3NF)1、要求一個數據庫表中不包含已在其它表中已包含的非主鍵字段。2、如果能夠被推導出來,就不應該單獨的設計一個字段來存放(能盡量外鍵join就用外鍵join)。3、很多時候,我們為了滿足第三范式往往會把一張表分成多張表。

MySQL優化的一般步驟:

  • 通過show status命令了解各種SQL的執行頻率
  • 定位執行效率較低的SQL語句-(重點select)
  • 通過explain分析低效率的SQL語句的執行情況
  • explain關鍵字作用

    • 使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸
    • EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等

    explain使用舉例

      Explain select * from emp where ename=“wsrcla”會產生如下信息:select_type: 表示查詢的類型。table: 輸出結果集的表type: 表示表的連接類型possible_keys: 表示查詢時,可能使用的索引key: 表示實際使用的索引key_len: 索引字段的長度rows: 掃描出的行數(估算的行數)Extra: 執行情況的描述和說明

    EXPLAIN信息詳解

    1. id SELECT識別符。這是SELECT的查詢序列號2. select_type PRIMARY : 子查詢中最外層查詢SUBQUERY : 子查詢內層第一個SELECT,結果不依賴于外部查詢DEPENDENT SUBQUERY: 子查詢內層第一個SELECT,依賴于外部查詢UNION : UNION語句中第二個SELECT開始后面所有SELECT,SIMPLE: 簡單的 select 查詢,不使用 union 及子查詢UNION : UNION 中的第二個或隨后的 select 查詢,不依賴于外部查詢的結果集3. Table : 顯示這一步所訪問數據庫中表名稱4. Type : 對表訪問方式ALL: SELECT * FROM emp \G 完整的表掃描 通常不好SELECT * FROM (SELECT * FROM emp WHERE empno = 1) a ;system: 表僅有一行(=系統表)。這是const聯接類型的一個特const: 表最多有一個匹配行5. Possible_keys : 該查詢可以利用的索引,如果沒有任何索引顯示 null6. Key : Mysql 從 Possible_keys 所選擇使用索引7. Rows : 估算出結果集行數8. Extra查詢細節信息No tables : Query語句中使用FROM DUAL 或不含任何FROM子句Using filesort : 當Query中包含 ORDER BY 操作,而且無法利用索引完成排序,Impossible WHERE noticed after reading const tables: MYSQL Query Optimizer 通過收集統計信息不可能存在結果Using temporary: 某些操作必須使用臨時表,常見 GROUP BY ; ORDER BYUsing where: 不用讀取表中所有信息,僅通過索引就可以獲取所需數據;

    優化措施

    編寫 SQL 時就需要注意與索引相關的規則:

  • 字段類型轉換導致不用索引,如字符串類型的不用引號,數字類型的用引號等,這有可能會用不到索引導致全表掃描
  • mysql 不支持函數轉換,所以字段前面不能加函數,否則這將用不到索引
  • 不要在字段前面加減運算
  • 字符串比較長的可以考慮索引一部份減少索引文件大小,提高寫入效率
  • like % 在前面用不到索引
  • 根據聯合索引的第二個及以后的字段單獨查詢用不到索引
  • .不要使用 select *;會查詢全表的數據影響查詢效率
  • 排序請盡量使用升序
  • or 的查詢盡量用 union 代替(Innodb)
  • 復合索引高選擇性的字段排在前面
  • order by / groupby 字段包括在索引當中減少排序,效率會更高
  • SQL 編寫時還需要特別注意一下幾點:

  • 盡量規避大事務的 SQL,大事務的 SQL 會影響數據庫的并發性能及主從同步
  • 分頁語句 limit 的問題
  • 刪除表所有記錄請用 truncate,不要用 delete
  • 不讓 mysql 干多余的事情,如計算
  • 輸寫 SQL 帶字段,以防止后面表變更帶來的問題,性能也是比較優的 ( 涉及到數據字典解析,請自行查詢資料)
  • 在 Innodb上用 select count(*),因為 Innodb 會存儲統計信息
  • 慎用 Oder by rand()
  • delete和truncate的區別:

  • delete是DML,執行delete操作時,每次從表中刪除一行,并且同時將該行的的刪除操作記錄在redo和undo表空間中以便進行回滾(rollback)和重做操作,但要注意表空間要足夠大,需要手動提交(commit)操作才能生效,可以通過rollback撤消操作
  • truncate會刪除表中所有記錄,并且將重新設置高水線和所有的索引,缺省情況下將空間釋放到minextents個extent,除非使用reuse storage,。不會記錄日志,所以執行速度很快,但不能通過rollback撤消操作(如果一不小心把一個表truncate掉,也是可以恢復的,只是不能通過rollback來恢復)
  • drop> truncate > delete
  • 表的分割

    水平分割:

    大數據量的表,我們在提供檢索的時候,應該根據業務的需求,找到表的標準,并在檢索頁面約束用戶的檢索方式,而且要配合分頁

    垂直分割:

    把某個表的某些字段,這些字段,在查詢時候并不關系,但是數據量很大,我們建議將這些字段放到一個表中,從而提高效率

    數據庫優化方案

    1. 優化索引、SQL 語句、分析慢查詢

    2. 設計表的時候嚴格根據數據庫的設計范式來設計數據庫

    3. 使用緩存,把經常訪問到的數據而且不需要經常變化的數據放在緩存中,能節約磁盤IO

    4. 優化硬件;采用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;

    5. 采用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁盤的讀取效率

    6. 垂直分表;把一些不經常讀的數據放在一張表里,節約磁盤I/O

    7. 主從分離讀寫;采用主從復制把數據庫的讀操作和寫入操作分離開來

    8. 分庫分表分機器(數據量特別大),主要的的原理就是數據路由

    9. 選擇合適的表引擎,參數上的優化

    10. 進行架構級別的緩存,靜態化和分布式

    11. 不采用全文索引

    數據庫怎么優化查詢效率

    1、儲存引擎選擇:如果數據表需要事務處理,應該考慮使用InnoDB,因為它完全符合ACID特性。如果不需要事務處理,使用默認存儲引擎MyISAM是比較明智的

    2、分表分庫,主從。

    3、對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

    4、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描

    5、應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描

    6、應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描

    7、Update 語句,如果只更改1、2個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大量日志

    8、對于多張大數據量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

    參考原址來自于此

    總結

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

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