簡體   English   中英

數據庫查詢優化(MySql)

[英]Database query optimization (MySql)

我有三張桌子。

  1. 雷達數據表(以id為主要數據)也有兩列violation_file_id和violation_speed_id。

  2. Violation_speed表(以ID為主要值)

  3. 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 clausewhere 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.

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