[英]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_date
和reading_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的建議並將該列分為date
和time
列,否則無法對其進行改進。
首先,我將您的查詢更改為:
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.