2017-08-05 81 views
0

我有一個Linux VM與MySQL 5.7.19。登錄慢查詢和log-queries-not-using-indexes我注意到這個查詢:緩慢的查詢Mysql 5.7通過varchar列排序

# Time: 2017-08-05T11:10:36.881359Z 
# [email protected]: root[root] @ localhost [127.0.0.1] Id: 2070 
# Query_time: 0.000381 Lock_time: 0.000145 Rows_sent: 1 Rows_examined: 35 
SET timestamp=1501931436; 
SELECT * FROM `cliente` order by denominazione; 

因爲我設置long_query_time = 5,看來查詢記錄,因爲它不使用索引。地名釋義查詢我有:

id select_type  table partitions type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE cliente  NULL ALL  NULL NULL NULL NULL 35 100.00 Using filesort 

這是我的表的DDL:

CREATE TABLE `cliente` (
    `id` bigint(20) NOT NULL, 
    `creatoDa` varchar(255) DEFAULT NULL, 
    `dataInserimento` datetime DEFAULT NULL, 
    `dataUltimaModifica` datetime DEFAULT NULL, 
    `modificatoDa` varchar(255) DEFAULT NULL, 
    `ENTITY_UID` varchar(36) NOT NULL, 
    `version` int(11) DEFAULT NULL, 
    `attivo` tinyint(1) NOT NULL DEFAULT '1',  
    `denominazione` varchar(255) NOT NULL, 
    `email` varchar(255) DEFAULT NULL, 
    `note` longtext, 
    `password` varchar(255) NOT NULL, 
    `username` varchar(255) NOT NULL, 
    `dataUltimoPing` datetime DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 



ALTER TABLE `cliente` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `UK_75j8vo25r1ws35vccamep965h` (`ENTITY_UID`), 
    ADD UNIQUE KEY `UK_sgwkt4eif8lb1e5miakwnu7q9` (`username`), 
    ADD KEY `idx_denominazione` (`denominazione`), 
    ADD KEY `idx_attivo` (`attivo`) 

我不知道爲什麼MySQL是不使用索引來排序結果考慮到我有一個指數< 768 denominazione(varchar(255))字段。

+0

你的表有多少個記錄?優化器不會總是使用索引。 –

+0

我只有35條記錄 – drenda

回答

2

MySQL優化器是基於成本的,並且檢測到全表掃描是用有限數量的行/記錄檢索記錄的最快方法。而不是做隨機磁盤I/O來檢索這些現有記錄慢得多的記錄。其他記錄會自動使優化器在適當的時候利用您的索引。

+0

所以如果這是最好的選擇,爲什麼Mysql登錄緩慢的查詢文件?我的理解是我必須優化查詢。 – drenda

+2

@drenda只有35條記錄,優化程序得出結論,使用索引比完全掃描需要更長的時間。 –