mysql - sql查询速度的问题

标签 mysql sql

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

这是表结构:

+---------------+------------+------+-----+-------------------+----------------+
| 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)

这是查询:

        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

这是结果:

+-------+-----------+---------------+----------+--------+----------+---------------------+-------+
| 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)

非常感谢您的帮助。

编辑一些描述:

该应用程序本身就像俱乐部成员(member)的签到系统。每次成员(member)登录或注销时,都会在数据库中注册。为了使该应用程序有用,它必须显示一天中任何给定时间谁在线。所以我的查询是获取当天的所有登录,如果最近的事件是登录,那么它将输出到应用程序。所有这一切都非常有效,但如果他们必须等待几秒钟才能看到谁在线谁不在线,这对用户来说就不是那么友好了。

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

最佳答案

您的查询过载了 WAYYYY...因为您需要一个特定的日期,所以我会在

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

然后,尝试以下操作...由于表使用自动递增,最大数字意味着最近的日期...因此,我们可以获得每个 MedlemsID 的最大 ID,以便仅允许更快地加入那些合格

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

关于mysql - sql查询速度的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7016125/

相关文章:

mysql - SQL 查询中日期范围的 DATEDIFF() 或 BETWEEN

sql - PostgreSQL - 我应该如何使用 first_value()?

sql - postgresql - 使用命令导出选择查询结果

php - 从哪里选择的查询在 codeigniter 模型中不起作用

php - 这个sql代码有什么问题?

mysql - 如何在存储过程 WHERE 子句中使用 IF/CASE 语句

mysql - 将两个查询合并为一个

php - 为什么 MySQL INSERT 语句无法正常运行

PHP将下拉值保存到mysql

sql - 如何从多个可能为空的搜索框中查询一个字段