[英]Database query optimization (MySql)
我有三張桌子。
雷達數據表(以id為主要數據)也有兩列violation_file_id和violation_speed_id。
Violation_speed表(以ID為主要值)
encer_file表(以id為主要)
我想選擇從某些開始時間間隔到結束時間間隔的所有限制為1000的雷達數據,並與violation_speed表一起使用。 每個雷達數據必須具有一個violation_speed_id。
然后,我想與violation_file表聯接,但不是每個雷達記錄都對應於violation_file_id,有些記錄的violation_file_id為0,這意味着沒有對應的文件。
我目前的SQL是這樣的,
$results = DB::table('radar_data')
->join('violation_speed', 'radar_data.violation_speed_id', '=', 'violation_speed.id')
->leftjoin('violation_video_file', 'radar_data.violation_video_file_id', '=', 'violation_video_file.id')
->select('radar_data.id as radar_id',
'radar_data.violation_video_file_id',
'radar_data.violation_speed_id',
'radar_data.speed',
'radar_data.unit',
'radar_data.violate',
'radar_data.created_at',
'violation_speed.violation_speed',
'violation_speed.unit as violation_unit',
'violation_video_file.video_saved',
'violation_video_file.video_deleted',
'violation_video_file.video_uploaded',
'violation_video_file.path',
'violation_video_file.video_name')
->where('radar_data.violate', '=', '1')
->orderBy('radar_data.id', 'desc')
->offset($from_id)
->take($max_length)
->get();
是PHP Laravel。 但是我認為直接轉換為mysql語句是可以的。
我的問題是,這樣選擇數據的好方法嗎? 我嘗試過,但是如果雷達數據增長到一個很大的值,這似乎有點慢。
謝謝。
查詢的速度通常取決於對joining clause
和where clause
使用正確的索引。
在您的查詢中有2個聯接,如果聯接索引沒有索引,則可能需要應用以下內容
alter table radar_data add index violation_speed_id_idx(violation_speed_id);
alter table radar_data add index violation_video_file_id_idx(violation_video_file_id);
alter table radar_data add index violate_idx(violate);
id是主鍵,因此它們已經被索引並且應該被覆蓋
假設您設置了正確的索引,這在很大程度上是要走的路,對我而言,唯一不十分清楚的是offset()
方法的作用,但是如果它只是添加了WHERE
子句,則應該為您提供您將獲得的最佳性能。 如果不是,則將其替換為where('radar_data.id', '>', $from_id)
最重要的索引是此處的外鍵和主鍵上的索引。 並確保不要忘記violate
索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.