首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sql查询速度问题

sql查询速度问题
EN

Stack Overflow用户
提问于 2011-08-11 02:50:14
回答 4查看 106关注 0票数 2

我正在为执行速度非常慢的MySQL查询而苦苦挣扎。我希望你们中的一些人能够给我一些关于如何提高这个查询速度的建议。

这是表结构:

代码语言:javascript
运行
复制
+---------------+------------+------+-----+-------------------+----------------+
| Field         | Type       | Null | Key | Default           | Extra          |
+---------------+------------+------+-----+-------------------+----------------+
| id            | int(11)    | NO   | PRI | NULL              | auto_increment |
| MedlemsID     | int(11)    | NO   | MUL | NULL              |                |
| Medlemsnummer | int(11)    | NO   |     | NULL              |                |
| Handling      | tinyint(1) | NO   |     | NULL              |                |
| KlubID        | int(11)    | NO   |     | NULL              |                |
| Klubtype      | varchar(5) | NO   |     | NULL              |                |
| Tidspunkt     | timestamp  | NO   | MUL | CURRENT_TIMESTAMP |                |
| Køn           | int(1)     | NO   |     | NULL              |                |
+---------------+------------+------+-----+-------------------+----------------+
8 rows in set (0.00 sec)

以下是查询:

代码语言:javascript
运行
复制
        SELECT * FROM ( 
                    SELECT * 
                        FROM Handlinger 
                        AS a 
                        WHERE date(Tidspunkt) = curdate() 
                        AND Tidspunkt = ( 
                            SELECT max(Tidspunkt) 
                            FROM Handlinger 
                            AS b 
                            WHERE a.MedlemsID = b.MedlemsID 
                            AND a.Klubtype = b.Klubtype 
                            ) 
                            ) 
                            AS c 
                            WHERE Handling=1 
                            AND KlubID=1 
                            ORDER BY Medlemsnummer ASC

这就是结果:

代码语言:javascript
运行
复制
+-------+-----------+---------------+----------+--------+----------+---------------------+-------+
| id    | MedlemsID | Medlemsnummer | Handling | KlubID | Klubtype | Tidspunkt           | Køn   |
+-------+-----------+---------------+----------+--------+----------+---------------------+-------+
| 24743 |       613 |            10 | 1        |      1 | UK       | 2011-08-10 12:14:10 | Pige  |
| 24733 |       572 |            11 | 1        |      1 | UK       | 2011-08-10 10:45:00 | Pige  |
| 24731 |       705 |            13 | 1        |      1 | FK       | 2011-08-10 10:31:35 | Dreng |
| 24740 |       409 |            51 | 1        |      1 | FK       | 2011-08-10 11:48:19 | Dreng |
| 24757 |       443 |            88 | 1        |      1 | FK       | 2011-08-10 15:01:43 | Dreng |
| 24730 |       723 |            89 | 1        |      1 | FK       | 2011-08-10 10:30:13 | Dreng |
| 24749 |       465 |           110 | 1        |      1 | FK       | 2011-08-10 13:29:40 | Dreng |
| 24720 |       483 |           129 | 1        |      1 | FK       | 2011-08-10 10:03:43 | Dreng |
| 24725 |       748 |           181 | 1        |      1 | FK       | 2011-08-10 10:12:11 | Dreng |
| 24748 |       540 |           207 | 1        |      1 | FK       | 2011-08-10 13:26:54 | Dreng |
+-------+-----------+---------------+----------+--------+----------+---------------------+-------+
10 rows in set (2.95 sec)

非常感谢你的帮助。

编辑一些描述:

这个应用程序本身就像一个俱乐部会员的签到系统。每次成员登录或退出时,都会在数据库中注册。为了让应用程序有用,它必须显示在一天中任何给定时间都有谁在线。所以我的查询是获取当天的所有登录信息,如果最近的活动是登录,那么它将被输出到应用程序。所有这些都像一个咒语,但如果他们必须等待几秒钟才能看到谁在线,谁不在线,那么用户就不那么友好了。

希望这能让我的目标更清晰一点。:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-11 09:35:33

您的查询超载了……由于您期望的是一个特定的日期,因此我将在

日期( TidSpunkt )、处理、KlubID、MedlemsID

然后,尝试执行以下操作...由于该表使用自动递增,因此最大的数字将意味着最近的日期...因此,我们可以获得每个MedlemsID的最大ID,以便仅在符合条件的情况下才能更快地加入

代码语言:javascript
运行
复制
Select STRAIGHT_JOIN
      H1.*
   from 
      ( select 
              H2.MedlemsID, 
              max( H2.ID ) LastID
           from 
              Handlinger H2
           where
                  date( H2.Tidspunkt ) = curdate()
              AND H2.Handling = 1
              AND H2.KlubID = 1
           group by 
              H2.MedlemsID ) PreQuery
      JOIN Handlinger H1
         On PreQuery.LastID = H1.ID
   order by 
      H1.Medlemsnummer ASC
票数 1
EN

Stack Overflow用户

发布于 2011-08-11 03:11:46

你已经为你的表建立了索引吗?

如果没有,您应该创建两个索引:

  • 一个在medlemsID
  • 上,另一个在klubtype

只在medlemsID上先试一下,它应该已经好多了。

票数 1
EN

Stack Overflow用户

发布于 2011-08-11 03:23:48

我不知道你为什么要写这些子查询:

代码语言:javascript
运行
复制
            SELECT * 
                FROM Handlinger 
                AS a 
                WHERE date(Tidspunkt) = curdate() 
                AND Tidspunkt = ( 
                    SELECT max(Tidspunkt) 
                    FROM Handlinger 
                    AS b 
                    WHERE a.MedlemsID = b.MedlemsID 
                    AND a.Klubtype = b.Klubtype 
                    ) 

注意:使用索引并不是因为date(Tidspunkt)短语。尝试:

代码语言:javascript
运行
复制
SELECT `a`.* FROM Handlinger AS `a`
INNER JOIN (
    SELECT `id` FROM Handlinger WHERE
        Tidspunkt >= CONCAT(LEFT(NOW(), 10), ' 00:00:00')
        AND Handling=1 
        AND KlubID=1 
) AS jnd USING (`id`)
ORDER BY `a`.Medlemsnummer ASC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7016125

复制
相关文章

相似问题

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