[英]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.