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

歡迎訪問 生活随笔!

生活随笔

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

数据库

-%3erow mysql_MySQL查询优化

發布時間:2023/12/2 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 -%3erow mysql_MySQL查询优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# MySQL查詢優化

* [請簡述項目中優化MySQL語句執行效率的方法,從哪些方面入手,SQL語句性能如何分析?](https://www.kancloud.cn/ranjun940726/php_interview/596348#MySQLSQL_3)

* [分析查詢速度](https://www.kancloud.cn/ranjun940726/php_interview/596348#_5)

* [優化查詢過程中的數據訪問](https://www.kancloud.cn/ranjun940726/php_interview/596348#_74)

* [優化長難的查詢語句](https://www.kancloud.cn/ranjun940726/php_interview/596348#_93)

* [優化特定類型的查詢語句](https://www.kancloud.cn/ranjun940726/php_interview/596348#_106)

* [優化`count()`查詢](https://www.kancloud.cn/ranjun940726/php_interview/596348#count_108)

* [優化關聯查詢](https://www.kancloud.cn/ranjun940726/php_interview/596348#_118)

* [優化子查詢](https://www.kancloud.cn/ranjun940726/php_interview/596348#_124)

* [優化`group by`和`distinct`](https://www.kancloud.cn/ranjun940726/php_interview/596348#group_bydistinct_127)

* [優化`limit`子句](https://www.kancloud.cn/ranjun940726/php_interview/596348#limit_134)

* [優化`union`](https://www.kancloud.cn/ranjun940726/php_interview/596348#union_142)

# 請簡述項目中優化MySQL語句執行效率的方法,從哪些方面入手,SQL語句性能如何分析?

# 分析查詢速度

* 記錄慢查詢日志

分析查詢日志,使用`pt-query-digest`工具進行分析

* 使用`show profile`

set profiling=1; # 服務器上執行的所有語句會檢測消耗的時間、存到臨時表中

`show profiles # 所有的SQL語句執行記錄`

`show profile for query 臨時表ID # 查執行ID的SQL語句`

~~~

mysql> set profiling=1;

Query OK, 0 rows affected

mysql> select * from user;

+----+------+-----+

| id | name | age |

+----+------+-----+

| 1 | Jack | 23 |

+----+------+-----+

1 row in set

mysql> show profiles;

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

| Query_ID | Duration | Query |

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

| 1 | 8.675E-5 | set profiling=1 |

| 2| 0.000197 | select * from user |

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

10 rows in set

mysql> show profile for query 2;

+----------------------+----------+

| Status | Duration |

+----------------------+----------+

| starting | 4.3E-5 |

| checking permissions | 7E-6 |

| Opening tables | 1.8E-5 |

| System lock | 1E-5 |

| init | 1.4E-5 |

| optimizing | 4E-6 |

| statistics | 3.1E-5 |

| preparing | 1E-5 |

| executing | 2E-6 |

| Sending data | 1E-5 |

| end | 3E-6 |

| query end | 2E-6 |

| closing tables | 5E-6 |

| freeing items | 3.5E-5 |

| logging slow query | 3E-6 |

| cleaning up | 2E-6 |

+----------------------+----------+

16 rows in set

~~~

* show status

`show status`會返回一些計數器,`show global status`查看服務器級別的所有計數。

* show processlist

觀察是否有大量的線程處于不正常的狀態或特征。

* explain

分析單條的SQL語句

~~~

mysql> explain select * from user;

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

| 1 | SIMPLE | user | system | NULL | NULL | NULL | NULL | 1 | |

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

1 row in set

~~~

> explain它有一個別名`desc`,所以使用`desc select * from user;`查詢到的結果與上面的一樣。

# 優化查詢過程中的數據訪問

* 數據太多會導致查詢性能下降。

* 確定應用程序是否在檢索大量超過需要的數據,可能太多行或列。

* 確認MySQL服務器是否在分析大量不必要的數據行

**避免使用以下SQL語句**

* 查詢不需要的記錄,使用`limit`解決

* 多表管理返回全部列,需要制定列,[如A.id](http://xn--a-ch1b.id/)、B.name等

* 總是取出全部列,`select *`會讓優化器無法完成索引覆蓋掃描優化

* 重復查詢相同的數據,可以使用緩存,下次直接讀取緩存

**是否在掃描額外的記錄**

使用`explain`來進行分析,如果發現查詢需要掃描大量的數據但是只返回少數的行,可以通過如下技巧去優化:

* 使用索引覆蓋掃描,把所有的列都放在索引中。

* 改變數據庫和表的結構,修改數據表范式

* 重寫SQL語句,讓優化器可以以最優的方式執行查詢

# 優化長難的查詢語句

使用盡可能小的查詢是好的,但有時將一個大的查詢分解成多個小的查詢是很有必要的。

* **切分查詢**

將一個大的查詢分為多個小的相同的查詢

一次性刪除1000萬的數據比一次刪除1萬,暫停一會兒在執行刪除1萬條數據要較少更多的服務器開銷。

* **分解關聯查詢**

可以將一條關聯語句分解成多個SQL語句執行

讓緩存的效率更高

執行單個查詢可以減少鎖的競爭

在應用層做關聯可以更容易對數據庫進行拆分

# 優化特定類型的查詢語句

## 優化`count()`查詢

* `count(*)`占用的`*`會忽略所有的列,直接統計所有的列數,因此不要使用`count(列名)`

* MyISAM中`沒有任何where條件的count(* )`查詢速度非常快

* `有where條件`時,MyISAM的count統計不一定比其他表引擎快

優化:

* 可以使用`explain`查詢近似值,用近似值代替`count(*)`

* 增加匯總表

* 使用緩存

## 優化關聯查詢

* 確定on或者using子句的列上有索引;

* 確保`group by`和`order by`中只有一個表中的列,這樣MySQL才有可能使用索引;

## 優化子查詢

盡量使用關聯查詢替代

## 優化`group by`和`distinct`

* 使用**索引**來優化

* 關聯查詢中,使用**標識列**(主鍵列)進行分組的效率會更高

* 如果不需要`order by`,進行`group by`時使用`order by NULL`,MySQL不會進行文件排序

* `with rollup`超級劇和,可以挪到應用程序處理

## 優化`limit`子句

`limit`偏移量大的時候,查詢效率較低。

方案:

* 記錄上一次查詢的最大ID,下次查詢時直接根據ID來查詢(還是使用limit查詢,不過加一個where條件,id > ID)

## 優化`union`

`union all`的效率高于`union`。

總結

以上是生活随笔為你收集整理的-%3erow mysql_MySQL查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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