Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-性能查询的帮助_Mysql_Performance_Greatest N Per Group - Fatal编程技术网

MySQL-性能查询的帮助

MySQL-性能查询的帮助,mysql,performance,greatest-n-per-group,Mysql,Performance,Greatest N Per Group,我有一个表,我保存所有登录到我的网站。结构如下: TABLE users_logins loginid INT UNSIGNED AUTO_INCREMENT PRIMARY KEY userid INT iplogin VARCHAR(15) logindate datetime 现在,我需要一个查询来检索第一次使用相同IP登录的用户数。结果应该是: iplogin | numberofaccounts 其中'numberofaccounts'是,正如我前面所说的,第一次使用相同'ipl

我有一个表,我保存所有登录到我的网站。结构如下:

TABLE users_logins

loginid INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
userid INT
iplogin VARCHAR(15)
logindate datetime
现在,我需要一个查询来检索第一次使用相同IP登录的用户数。结果应该是:

iplogin | numberofaccounts
其中'numberofaccounts'是,正如我前面所说的,第一次使用相同'iplogin'登录的用户数

这张桌子大约有30万行……那么我应该怎么做才能获得我所需要的高性能呢

谢谢


L.

我只想在用户表中为第一个登录ip添加一列。那就简单了

select count(*), firstip 
from users 
group by firstip
添加以下索引:

alter table users_logins 
  add key (iplogin, userid, logindate),
  add key (userid, logindate);
现在演示一下,您可以通过查找同一用户没有其他早期登录的登录名来查询每个用户最早的登录名

这是一个常见的解决方案,用于获得每个用户的最大/最早条目或其他内容

select t1.iplogin, count(*) as numberofaccounts 
from users_logins as t1 
left outer join users_logins as t2 
  on (t1.userid=t2.userid and t1.logindate > t2.logindate) 
where t2.userid is null 
group by iplogin\G
上面定义的索引有助于
左侧外部联接
分组依据

解释报告显示,这是非常好的优化。它对两个表都使用索引,并且不会导致临时表或文件排序,这通常是性能杀手

它确实执行索引扫描(
type:index
),这意味着它读取整个索引,但至少这不是表扫描

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: index
possible_keys: iplogin
          key: iplogin
      key_len: 29
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: Using index
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: t2
   partitions: NULL
         type: ref
possible_keys: userid
          key: userid
      key_len: 5
          ref: test.t1.userid
         rows: 1
     filtered: 100.00
        Extra: Using where

定义“良好绩效”。由于只有30万行,除非您使用486作为服务器,否则这并不重要。表中有多少不同的用户(
distinct user\u id
)?还有多少不同的IP?@ypercube不太多,35k左右。我同意你的看法,泰勒,我已经在考虑过了,但不幸的是,编辑结构目前还不是一个选项。