我有三张桌子。
我想选择所有雷达数据,限制为1000,从某个起始间隔到一个结束间隔,加入到violation_speed表。每个雷达数据必须有一个violation_speed_id。
然后我想加入violation_file表,但并不是每个雷达记录都对应于violation_file_id,有些记录的violation_file_id值为0,这意味着没有curresponding文件。
我现在的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语句。
我的问题是,这是选择这样的数据的好方法吗?我试过了,但如果雷达数据增长到一个很大的值,这似乎有点慢。
谢谢。
发布于 2015-06-30 07:28:59
假设您设置了适当的索引--这在很大程度上是可行的,我唯一不清楚的是offset()方法是做什么的,但是如果它仅仅添加了一个WHERE子句,那么它将给您提供几乎最好的性能。如果不是,请用where('radar_data.id', '>', $from_id)替换它
最重要的索引是外键和主键上的索引。并确保不要忘记violate索引。
发布于 2015-06-30 07:28:29
查询的速度通常依赖于在所使用的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);ids是主键,因此它们已经被索引,应该包括在内。
https://stackoverflow.com/questions/31132001
复制相似问题