首頁 資料庫 mysql教程 分享Mysql優化思路

分享Mysql優化思路

Apr 23, 2020 pm 01:37 PM
mysql

一、整體最佳化思路

首先建構腳本觀察查詢數,連接數等數據,確定環境原因以及內部SQL執行原因,然後根據具體原因做具體處理。

推薦:《mysql影片教學

二、建立腳本觀察狀態

mysqladmin -uroot -p  ext \G
登入後複製

 

該命令可獲取當前查詢數量等信息,定時輪詢並將結果重定向到文字中,然後處理成圖表。

三、處理對策

#1.若是規律性出現查詢慢,考慮快取雪崩問題。

對於此問題只需將快取的失效時間處理成不要相近時間同時失效,失效時間盡量離散化,或集中到午夜失效。

2.若非規律性查詢緩慢,考慮設計缺乏最佳化

處理方法:

a:開啟profiling記錄查詢操作,並取得語句執行詳細資訊

show variables like '%profiling%';
set profiling=on;
select count(*) from user; 
show profiles;
show profile for query 1;
>>>
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000060 |
| Executing hook on transaction  | 0.000004 |
| starting                       | 0.000049 |
| checking permissions           | 0.000007 |
| Opening tables                 | 0.000192 |
| init                           | 0.000006 |
| System lock                    | 0.000009 |
| optimizing                     | 0.000005 |
| statistics                     | 0.000014 |
| preparing                      | 0.000017 |
| executing                      | 0.001111 |
| end                            | 0.000006 |
| query end                      | 0.000003 |
| waiting for handler commit     | 0.000015 |
| closing tables                 | 0.000011 |
| freeing items                  | 0.000085 |
| cleaning up                    | 0.000008 |
+--------------------------------+----------+
登入後複製

 

b:使用explain 查看語句執行情況,索引使用,掃描範圍等等

mysql> explain select count(*) from goods \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: goods
   partitions: NULL
         type: index   
possible_keys: NULL
          key: gid
      key_len: 5
          ref: NULL
         rows: 3
     filtered: 100.00
        Extra: Using index
登入後複製

 

c:相關最佳化手法

表格的最佳化與列類型選擇

列選擇原則:

1:欄位類型優先權整數> date,time > char,varchar > blob

#原因:整數,time運算快,節省空間

char/varchar要考慮字元集的轉換與排序時的校對集,速度慢

blob無法使用記憶體暫存表

2:夠用就行,不要慷慨(如smallint,varchar(N))

原因:大的字段浪費內存,影響速度

以varchar(10), varchar( 300)儲存的內容相同,但在表格聯查時,varchar(300)要花更多記憶體

3:盡量避免使用NULL

原因:NULL不利於索引,要用特殊的位元組來標註.

在磁碟上佔據的空間其實更大

#索引最佳化策略

##1.索引類型

1.1 B-tree索引(排好序的快速尋找結構)

註:Myisam,innodb中,預設用的是B-tree索引

1.2 hash索引

在memory表裡,預設是hash索引,hash的理論查詢時間複查度為O(1)

疑問:既然hash索引如此高效,為何不都用他?

a.hash函數計算後的結果是隨機的,如果是在磁碟上放置數據,以主鍵為id為例,那麼隨著id的增長,id對應的行,在磁碟上隨機放置。

b.無法對範圍查詢進行最佳化

c.無法利用前綴索引,例如在b-tree中,field列的值為“helloworld”,索引查詢xx=hello/xx =helloworld都可以利用索引(左前綴索引),但hash索引無法做到,因為hash(hello)與hash(helloworld)並無關聯關係。

d.排序也無法最佳化

e.必須回行,透過索引拿到資料位置,必須回到表中取資料.

2.b-tree索引的常見誤解

2.1 在where條件常用的列上都加上索引

例:where cat_id=3 and price>100; //查詢第3個欄位,100元以上的商品

錯誤:cat_id和price上都加上索引。其實只能用上一個索引,他們都是獨立索引.

2.2 在多列上建立索引後,查詢哪個列,索引都會發揮作用

2.2 在多列上建立索引後,查詢哪個列,索引都會發揮作用

正解:多列索引上,索引發揮作用,需要滿足左前綴要求(層層索引)

以index(a, b,c)為例:

语句 索引是否发挥作用
where a=3 是
where a=3 and b=5 是
where a=3 and b=5 and c=4 是
where b=3 or where c=4 否
where a=3 and c=4 a列能发挥索引作用,c列不能
where a=3 and b>10 and c=7 a,b能发挥索引作用,c列不能
登入後複製

高效能索引策略

#1.對於innodb而言,因為節點下有資料文件,因此節點的分割將會變得比較慢,對於innodb的主鍵,盡量用整數,而且是遞增的整數。

2.索引的長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度(佔用記憶體多)。

3.針對列中的值,由左往右截取部分來建立索引。

a.截的越短,重複度越高,區分越小,索引效果越不好

b.截的越長,雖然區分度提高,但索引檔變大影響速度

所以盡量在長度上找到一個平衡點使效能最大化,慣用手法:截取不同長度來測試索引區分度

區分度測試: 

select count(distinct left(word, 1)) / count(*) from table;
登入後複製

測試完成後可依測試所得的最優長度建立索引 

alter table table_name add index word(word(4));
登入後複製

理想的索引

1.查詢頻繁

2.區分度高

3.長度小

4.盡量覆寫常用查詢欄位

以上是分享Mysql優化思路的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1257
24
laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在MySQL中解釋外鍵的目的。 在MySQL中解釋外鍵的目的。 Apr 25, 2025 am 12:17 AM

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

比較和對比Mysql和Mariadb。 比較和對比Mysql和Mariadb。 Apr 26, 2025 am 12:08 AM

MySQL和MariaDB的主要區別在於性能、功能和許可證:1.MySQL由Oracle開發,MariaDB是其分支。 2.MariaDB在高負載環境中性能可能更好。 3.MariaDB提供了更多的存儲引擎和功能。 4.MySQL採用雙重許可證,MariaDB完全開源。選擇時應考慮現有基礎設施、性能需求、功能需求和許可證成本。

SQL與MySQL:澄清兩者之間的關係 SQL與MySQL:澄清兩者之間的關係 Apr 24, 2025 am 12:02 AM

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

MySQL:數據庫,PHPMYADMIN:管理接口 MySQL:數據庫,PHPMYADMIN:管理接口 Apr 29, 2025 am 12:44 AM

MySQL和phpMyAdmin可以通過以下步驟進行有效管理:1.創建和刪除數據庫:在phpMyAdmin中點擊幾下即可完成。 2.管理表:可以創建表、修改結構、添加索引。 3.數據操作:支持插入、更新、刪除數據和執行SQL查詢。 4.導入導出數據:支持SQL、CSV、XML等格式。 5.優化和監控:使用OPTIMIZETABLE命令優化表,並利用查詢分析器和監控工具解決性能問題。

See all articles