首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库查询优化(MySql)

数据库查询优化(MySql)
EN

Stack Overflow用户
提问于 2015-06-30 07:21:45
回答 2查看 66关注 0票数 0

我有三张桌子。

  1. 雷达数据表(以id为主),也有两列violation_file_id和violation_speed_id。
  2. Violation_speed表(以id作为主表)
  3. violation_file表(以id作为主表)

我想选择所有雷达数据,限制为1000,从某个起始间隔到一个结束间隔,加入到violation_speed表。每个雷达数据必须有一个violation_speed_id。

然后我想加入violation_file表,但并不是每个雷达记录都对应于violation_file_id,有些记录的violation_file_id值为0,这意味着没有curresponding文件。

我现在的sql是这样的

代码语言:javascript
复制
$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语句。

我的问题是,这是选择这样的数据的好方法吗?我试过了,但如果雷达数据增长到一个很大的值,这似乎有点慢。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-30 07:28:59

假设您设置了适当的索引--这在很大程度上是可行的,我唯一不清楚的是offset()方法是做什么的,但是如果它仅仅添加了一个WHERE子句,那么它将给您提供几乎最好的性能。如果不是,请用where('radar_data.id', '>', $from_id)替换它

最重要的索引是外键和主键上的索引。并确保不要忘记violate索引。

票数 1
EN

Stack Overflow用户

发布于 2015-06-30 07:28:29

查询的速度通常依赖于在所使用的joining clausewhere clause上使用适当的索引。

在查询中有2个联接,如果连接键没有索引,则可能需要应用以下内容

代码语言:javascript
复制
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是主键,因此它们已经被索引,应该包括在内。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31132001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档