【问题标题】:Creating SQL Indexes?创建 SQL 索引?
【发布时间】:2015-05-29 22:07:09
【问题描述】:

我的数据库中有两个大致如下所示的表:

通讯:(拨打电话)

Timestamp            FromIDNumber ToIDNumber GeneralLocation 
2012-03-02 09:02:30  878          674        Grasslands 
2012-03-02 11:30:01  456          213        Tundra 
2012-03-02 07:02:12  789          654        Mountains 

运动:

Timestamp            IDNumber Type        X   Y  
2012-03-02 11:02:30  379      pedestrian  32  46
2012-03-01 12:32:41  654      pedestrian  54  56
2012-03-02 07:02:16  789      pedestrian  39  52 

我想运行这个查询:

SELECT c.senderID, c.timestamp, m.timestamp, m.x, m.y
FROM communication c
JOIN movement m 
ON c.senderID = m.visitorID
WHERE m.timestamp >= c.timestamp
ORDER BY m.timestamp LIMIT 1;  

基本上,我想找到最接近给定通信时间戳的移动时间戳。

问题是,这些表有数百万个条目,我需要使用索引。问题是,我是 SQL 新手,我不确定如何构建我的索引......我需要像这样分别为 m.timestamp 和 c.timestamp 设置一个吗?

CREATE INDEX mtstamp ON DBName.movement (timestamp); 

CREATE INDEX ctstamp ON DBName.communication (timestamp); 

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: mysql sql indexing phpmyadmin


    【解决方案1】:

    我认为您需要一个复合索引,其中包含您在 JOIN 中使用的 ID 和时间戳。否则,它将只使用 ID 索引进行连接,但随后必须扫描所有匹配的行以进行时间戳比较。

    CREATE INDEX sender_timestamp ON communication (senderID, timestamp);
    CREATE INDEX visitor_timestamp ON movement (visitorID, timestamp);
    

    【讨论】:

    • 哦...所以我基本上应该为m.timestampc.timestampc.senderIDm.visitorID 以及您发布的复合材料创建索引?当您使用需要来自两个表的列的语句时,您是否只使用复合索引?
    • senderIDvisitorID 不需要索引,因为复合索引的前缀也可以单独用作索引。
    • 我明白了,非常感谢!所以我刚刚编辑了我的问题,我的索引应该是这样的结构,对吗?
    【解决方案2】:

    我会在两个表的timestamp 上创建一个索引,因为该列在WHERE 条件中用于过滤行以及在ORDER BY 中用于排序。

    另外,在Communication 表中的senderIDMovement 表中的visitorID 上创建索引,除非它们是各自表上的主键列;因为这两列都涉及连接条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2015-10-10
      • 2018-12-04
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多