## 分析SQL語句
**分析sql查詢慢的方法**
* 記錄慢查詢日志;推薦使用pt-query-digest工具進行分析
* 使用 show profile
> * 使用 ` set profiling = 1;` 開啟 show profile ,服務器上執行的所有語句會檢測消耗的時間,存到臨時表中
> * `show profiles`
> * `show profile for query 臨時表ID`
* 使用show status
> * show status 會返回一些計數器,`show global status ` 查看服務器級別的所有計數器
> * 有時根據這些計數器,猜測哪些操作代價較高或者消耗時間多
* 使用show processlist; 觀察是否有大量線程處于不正常的狀態或者特征
* 使用explain 或 desc ; 分析單條sql語句
> 分析字段說明
> 
> select_type查詢類型 說明
>
**優化查詢過程中的數據訪問**
>[info]
> * 訪問數據太多導致查詢性能下降
> * 確定應用程序是否在檢索大量超過需要的數據,可能是太多行或列
> * 確認MySql服務器是否在分析大量不必要的數據行
> * 查詢不需要的記錄,使用`limit`解決
> * 不使用`select * ` 會讓優化器無法完成索引覆蓋掃描的優化
> * 查詢需要掃描大量的數據但只返回少數的行,可以使用`索引覆蓋`
```
mysql 內部每秒能掃描內存中上百萬行數據,相比之下,響應數據給客戶端就慢很多
使用盡可能少的查詢是好的,但是有時將一個大的查詢分解為多個小的查詢是很有必要的
```
**優化count()查詢**
* `count(*)`中的`*`會忽略所有的列,直接統計所有列數,因此不要使用`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來查詢
**優化union查詢**
* `union all` 的效率高于`union`
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron