繁体   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