簡體   English   中英

select語句在mysql上運行非常慢

[英]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類型(非常適合存儲這些值),因此請確保dateDATE類型,並在該列上添加索引以處理排序。

理想情況下,您可以從MyISAM切換到InnoDB,可以對其進行更好的調整,並借此機會將列重命名為date以外的其他名稱,這是保留關鍵字。

暫無
暫無

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

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