簡單解析MySQL中的cardinality異常
前段時間,一大早上,就收到報警,警告php-fpm程式的數量超過閾值。最終發現是一條sql沒用到索引,導致執行資料庫查詢慢了,最終導致php-fpm程式數增加。最終透過analyze table feed_comment_info_id_0000 命令更新了Cardinality ,才能再次用到索引。
排查過程如下:
sql語句:
?
1 |
select id from feed_comment_info_id_0000 where obj_id=101 and type=1;
|
索引資訊:
?
12345678910 |
show index from feed_comment_info_id_0000 + ---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | + ---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ | feed_comment_info_id_0000 | 0 | PRIMARY | 1 | id | A | 6216 | NULL | NULL | | BTREE | | | feed_comment_info_id_0000 | 1 | obj_type | 1 | obj_id | A | 6216 | NULL | NULL | | BTREE | | | feed_comment_info_id_0000 | 1 | obj_type | 2 | type | A | 6216 | NULL | NULL | YES | BTREE | | | feed_comment_info_id_0000 | 1 | user_id | 1 | user_id | A | 6216 | NULL | NULL | | BTREE | | + ---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 5 rows in set (0.00 sec)
|
透過explian檢視時,發現sql用的是主鍵PRIMARY,而不是obj_type索引。透過show index 檢視索引的Cardinality值,發現這個值是實際資料的兩倍。感覺這個Cardinality值已經不正常,因此透過analyzea table命令對這個值從新進行了計算。命令執行完畢後,就可用使用索引了。
Cardinality解釋
官方文件的解釋:
An estimate of the number of unique values in the index. This is updated by running ANALYZE TABLE or myisamchk -a. Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables. The higher the cardinality, the greater the chance that MySQL uses the index when doing
總結一下:
1、它代表的是索引中唯一值的數目的估計值。如果是myisam引擎,這個值是一個準確的值。如果是innodb引擎,這個值是一個估算的值,每次執行show index 時,可能會不一樣
2、建立Index時(primary key除外),MyISAM的表Cardinality的值為null,InnoDB的表Cardinality的值大概為行數;
3、值的大小會影響到索引的選擇
4、建立Index時,MyISAM的表Cardinality的值為null,InnoDB的表Cardinality的值大概為行數。
5、可以透過Analyze table來更新一張表或者mysqlcheck -Aa來進行更新整個資料庫
6、可以透過 show index 檢視其值
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2805461/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單介紹Python中異常處理用法Python
- OutOfMemoryException異常解析Exception
- 簡單的全域性異常統一處理
- Centos 系統簡單排查流量異常問題CentOS
- JVM異常現象解析JVM
- 異常處理全面解析
- CoreDNS解析異常記錄DNS
- java中的異常Java
- Java 中的異常Java
- dns解析狀態異常怎麼處理 dns解析異常怎麼修復DNS
- 簡單分析MySQL中的primary key功能MySql
- 【Java面試】請簡單說一下你對受檢異常和非受檢異常的理解Java面試
- 那些年,我們解析過的前端異常前端
- 簡單瞭解 MySQL 中相關的鎖MySql
- 異常中的異常——藉助系統異常處理特例實現匪夷所思的漏洞利用
- MySQL實戰 | 06/07 簡單說說MySQL中的鎖MySql
- [MySQL光速入門]017 儲存過程中的"異常處理"MySql儲存過程
- SpringBoot原始碼解析-ExceptionHandler處理異常的原理Spring Boot原始碼Exception
- UINavigationBar簡單解析UINavigation
- SpringBoot中SpringSecurity 中不能丟擲異常UserNameNotFoundException 問題解析與處理Spring BootGseException
- 異常-異常的注意事項
- 異常和中斷
- Ruby中的TypeError異常處理Error
- SpringBoot專案中遇到的異常Spring Boot
- MySQL儲存過程的異常處理方法MySql儲存過程
- 異常-異常的概述和分類
- 異常-throws的方式處理異常
- 異常-編譯期異常和執行期異常的區別編譯
- SpringBoot中異常處理Spring Boot
- 記一次FreeBSD系統中mysql服務異常的排查過程MySql
- Java異常處理場景中不同位置的返回值詳細解析Java
- 兩種異常(CPU異常、使用者模擬異常)的收集
- python異常處理中finally的作用Python
- gRPC 中的異常該如何處理?RPC
- Java 中的異常處理機制Java
- Kotlin實戰【五】Kotlin中的異常Kotlin
- 淺談 PHP 中異常類的使用PHP
- springboot專案中的異常處理Spring Boot