大家好,我有一个需要优化的查询。它的工作原理,但它的狗,表现明智。
内容如下:
SELECT *
FROM (
SELECT *
FROM views
WHERE user_id = '1'
ORDER BY
page DESC
) v
GROUP BY
v.session
我正在跟踪查看不同页面的视图,并且我想知道每个会话的最高页面,以便了解在任何给定条件下他们的点击量(从头到尾查看所有页面)会议。
基本上,我想做的是在GROUP之前对结果进行排序。以上是实现的,成本很高。
谁能用这个方法拍我的脑袋?谢谢你们!
更新:
说明:
"1" "PRIMARY" "<derived2>" "ALL" \N \N \N \N "3545" "Using temporary; Using filesort"
"2" "DERIVED" "views" "index" \N "page" "5" \N "196168" "Using where"
模式:
ID int(8) unsigned (NULL) NO PRI (NULL) auto_increment select,insert,update,references
page int(8) (NULL) YES MUL (NULL) select,insert,update,references
user_id int(8) (NULL) YES (NULL) select,insert,update,references
session int(8) (NULL) YES (NULL) select,insert,update,references
created datetime (NULL) NO select,insert,update,references
索引信息:
views 0 PRIMARY 1 ID A 196008 (NULL) (NULL) BTREE
views 1 page 1 page A 259 (NULL) (NULL) YES BTREE
我正在跟踪查看不同页面的视图,并且我想知道每个会话的最高页面,以便了解在任何给定条件下他们的点击量(从头到尾查看所有页面)会议。
分组之前先订购是一种非常不可靠的方法。
MySQL
扩展GROUP BY
语法:您可以在SELECT
andORDER BY
子句中使用未分组和未聚合的字段。
在这种情况下,page
每个输出一个随机值session
。
文档
明确指出,您永远不应对将确切确定为哪个值做任何假设:
如果您从
GROUP BY
零件中省略的列在组中不是恒定的,请不要使用此功能。服务器可以自由地从组中返回任何值,因此除非所有值都相同,否则结果是不确定的。
但是,实际上,将返回扫描的第一行中的值。
由于您ORDER BY page DESC
在子查询中使用,因此该行恰好是page
每个会话最多的行。
您不应该依赖它,因为此行为没有记录,并且如果在下一版本中将返回其他行,则不会将其视为错误。
但是,您甚至不必做这些令人讨厌的把戏。
只需使用聚合函数:
SELECT MAX(page)
FROM views
WHERE user_id = '1'
GROUP BY
session
这是记录在案的,干净的方法来做您想要的。
创建一个复合索引(user_id, session, page)
以使查询运行更快。
如果您需要表中的所有列,而不仅是聚合的列,请使用以下语法:
SELECT v.*
FROM (
SELECT DISTINCT user_id, session
FROM views
) vo
JOIN views v
ON v.id =
(
SELECT id
FROM views vi
WHERE vi.user_id = vo.user_id
AND vi.session = vo.session
ORDER BY
page DESC
LIMIT 1
)
这假设id
是PRIMARY KEY
on views
。
问题内容: 这就是整个查询… 如果… 和… 有明显的理由吗? 正在服用? 扩展说明 问题答案: 您可以始终使用EXPLAIN或EXPLAIN EXTENDED 来查看MySql对查询所做的操作 您也可以用稍微不同的方式编写查询,是否尝试过以下方法? 看看效果如何会很有趣。我希望它会更快,因为目前,我认为MySql将为您拥有的每个节目运行内部查询1(这样一个查询将运行多次。联接应该更有效。) 如果希
主要内容:概述,一、关联查询优化,1.左(右)外连接,2.内连接,3.JOIN语句原理,4.JOIN小结,5.Hash Join,二、子查询优化,三、排序优化,四、GROUP BY优化,五、优先考虑覆盖索引,六、使用前缀索引,七、索引下推ICP,八、其他查询优化,1.COUNT(*)与COUNT(具体字段)效率,2.不使用SELECT *,3.LIMIT 1优化,4.多使用commit概述 数据库调优的方式有多种: 建立索引、充分利用到索引、不让索引失效 对SQL语句进行优化 调优如缓冲、线程数
本文向大家介绍Mysql优化技巧之Limit查询的优化分析,包括了Mysql优化技巧之Limit查询的优化分析的使用技巧和注意事项,需要的朋友参考一下 前言 在实际业务中对于分页来说是一个比较常见的业务需求。那么就会使用到limit查询,当我们在使用Limit查询的时候,在数据比较小、或者只查询前面一部分数据的时候效率是很高的。但是当数据量大的时候,或者查询offset数量比较大的时候,如:lim
问题内容: 一个供您所有MySQL专家使用的技巧:-) 我有以下查询: 订单表= 80,900行 产品表= 125,389行 o.id和p.order_id已建立索引 该查询大约需要6秒钟才能完成-太长了。我正在寻找一种优化它的方法,可能使用临时表或其他类型的联接。恐怕我对这两个概念的理解还很有限。 谁能建议我优化此查询的方法? 问题答案: 首先,我将使用其他样式的语法。 已经有20年的睡眠时间了
主要内容:GROUP BY单独使用,GROUP BY 与 GROUP_CONCAT() ,GROUP BY 与聚合函数,GROUP BY 与 WITH ROLLUP在 MySQL 中, GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。 使用 GROUP BY 关键字的语法格式如下: GROUP BY <字段名> 其中,“字段名”表示需要分组的字段名称,多个字段时用逗号隔开。 GROUP BY单独使用 单独使用 GROUP BY 关键字时,查询结果会只显示每个分组的第一条记录。
在MySQL数据库中,我遇到了一个问题,当我在执行一个JOIN查询时,发现查询性能显著降低,特别是在两个大表之间进行JOIN操作时。我的两个表分别是orders(订单表,大约有1000万条记录)和customers(客户表,大约有500万条记录),它们通过customer_id字段相关联。我已经为这两个表的customer_id字段建立了索引,但是在执行如下JOIN查询时,耗时仍然较长: 运行环境