簡體   English   中英

MySQL innoDB:查詢執行時間長

[英]MySQL innoDB: Long time of query execution

我在運行此SQL時遇到了麻煩:

在此處輸入圖片說明

我認為這是一個index problem但我不知道,因為我沒有創建此數據庫,而且我只是一個簡單的程序員。

問題是,該表具有64260條記錄,因此查詢在執行時變得瘋狂,我必須停止mysql並再次運行,因為計算機被凍結。

謝謝。

編輯:表架構

CREATE TABLE IF NOT EXISTS `value_magnitudes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` float DEFAULT NULL,
  `magnitude_id` int(11) DEFAULT NULL,
  `sdi_belongs_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `reading_date` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1118402 ;

詢問

select * from value_magnitudes
where id in 
(
    SELECT min(id)
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and date(reading_date) >= '2013-04-01'
    group by date(reading_date)
)

編輯2

在此處輸入圖片說明

由於要獲得每天的結果,因此需要使用date()函數從datetime列中提取日期。 這使索引無用。

您可以將reading_date列拆分為reading_datereading_time 然后,您可以在不使用函數的情況下運行查詢,索引將起作用。

此外,您可以將查詢更改為join

select * 
from value_magnitudes v
inner join 
(
    SELECT min(id) as id
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and reading_date >= '2013-04-01'
    group by reading_date
) x on x.id = v.id

首先,在(magnitude_id, reading_date)上添加一個索引:

ALTER TABLE
  ADD INDEX magnitude_id__reading_date__IX       -- just a name for the index
    (magnitude_id, reading_date) ;

然后嘗試這種變化:

SELECT vm.* 
FROM value_magnitudes AS vm
  JOIN 
  ( SELECT MIN(id) AS id
    FROM value_magnitudes
    WHERE magnitude_id = 234
      AND reading_date >= '2013-04-01'         -- changed so index is used
    GROUP BY DATE(reading_date)
  ) AS vi
    ON vi.id = vm.id ;

GROUP BY DATE(reading_date)仍然需要將函數應用於所有選定的行(通過索引進行),除非您遵循@jurgen的建議並將該列分為datetime列,否則無法對其進行改進。

首先,我將您的查詢更改為:

select * from value_magnitudes where id = (
  select min(id) from value_magnitudes
  where magnitude_id = 234
  and DATE(reading_date) >= '2013-04-01' 
)

當子查詢只返回一個記錄時,您不需要使用IN子句。

然后,我將確保您有一個有關itudes_id和reading_date的索引(可能是兩個字段的索引),因為這就是您要在子查詢中查詢的內容。 沒有該索引,您每次都在掃描表。

同樣,如果可能,將itude_id和reading_date更改為非null。 空值和索引不太適合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM