[英]select statement runs very slow on mysql
即使限制= 10,此php select語句的運行也會非常緩慢。
$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);
if ($conn->connect_error) {
trigger_error('Database connection failed: ' . $conn->connect_error, E_USER_ERROR);
exit();
}
$sql = 'SELECT id, date, UNIX_TIMESTAMP(date) AS UDATE, col1, col2 FROM ' . $table . ' ORDER BY UDATE DESC LIMIT ' . $id . ', ' . $limit . ';';
$result = $conn->query($sql);
$data = array();
if($result === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
}
else {
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
}
$result->free();
echo json_encode(array_reverse($data));
該表還具有1400萬行的非常大的數據,它是MyISAM引擎。
如何優化此腳本以使其運行更快?
這是我的創建表
CREATE TABLE `my_tbl`
(`id` int(11) NOT NULL AUTO_INCREMENT,
`date` varchar(45) NOT NULL,
`col1` float NOT NULL,
`col2` float NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `date` (`date`))
ENGINE=MyISAM AUTO_INCREMENT=14475739
DEFAULT CHARSET=latin1
非常感謝
此查詢中存在許多問題,但最大的問題是您正在計算列上調用ORDER BY
。 這需要掃描整個表以產生該派生值,然后對結果進行排序,這通常涉及在磁盤上創建臨時表。 處理大量數據的速度非常慢。
由於您要排序的值是一個日期,並且SQL具有DATE
類型(非常適合存儲這些值),因此請確保date
為DATE
類型,並在該列上添加索引以處理排序。
理想情況下,您可以從MyISAM切換到InnoDB,可以對其進行更好的調整,並借此機會將列重命名為date
以外的其他名稱,這是保留關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.