买家按注册日期查询优化结构

时间:2017-07-05 07:10:46

标签: mysql query-optimization

我想通过注册日期来显示买家结构,例如:

<!DOCTYPE html>
<html>
<head>
<style>
table {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

table tbody tr:nth-child(6n+1),table tbody tr:nth-child(6n+2),table tbody 
tr:nth-child(6n+3) {
     background: #dddddd;
}

td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 1px;
}


</style>
</head>
<body>

<table id="table2">
<thead>
  <tr>
    <th>Company</th>
    <th>Contact</th>
    <th>Country</th>
  </tr>
</thead>
<tbody>
  <tr bgcolor="#dddddd">
    <td >Alfreds Futterkiste</td>
    <td>Maria Anders</td>
    <td>Germany</td>
  </tr>
  <tr bgcolor="#dddddd">
    <td >Centro comercial Moctezuma</td>
    <td>Francisco Chang</td>
    <td>Mexico</td>
  </tr>
  <tr bgcolor="#dddddd">
    <td >Ernst Handel</td>
    <td>Roland Mendel</td>
    <td>Austria</td>
  </tr>
  <tr>
    <td>Island Trading</td>
    <td>Helen Bennett</td>
    <td>UK</td>
  </tr>
  <tr>
    <td>Laughing Bacchus Winecellars</td>
    <td>Yoshi Tannamuri</td>
    <td>Canada</td>
  </tr>
  <tr>
    <td>Magazzini Alimentari Riuniti</td>
    <td>Giovanni Rovelli</td>
    <td>Italy</td>
  </tr>
  <tr bgcolor="#dddddd">
    <td >Alfreds Futterkiste</td>
    <td>Maria Anders</td>
    <td>Germany</td>
  </tr>
  <tr bgcolor="#dddddd">
    <td >Centro comercial Moctezuma</td>
    <td>Francisco Chang</td>
    <td>Mexico</td>
  </tr>
  <tr bgcolor="#dddddd">
    <td >Ernst Handel</td>
    <td>Roland Mendel</td>
    <td>Austria</td>
  </tr>
  <tr>
    <td>a</td>
    <td>b</td>
    <td>c</td>
  </tr>
  <tr>
    <td>a</td>
    <td>b</td>
    <td>c</td>
  </tr>
  <tr>
    <td>a</td>
    <td>b</td>
    <td>c</td>
  </tr>
<tbody>
</table>

</body>
</html>

从哪个

H12016 10.000 buyers

我有两个问题:

1号(2016年上半年的买家(约5万条记录)):

2.000 registered in H12014

4.000 registered in H22014

Number 2(users_ids及其注册(插入)日期(约3,8M用户)):

SELECT DISTINCT
r.idUsera as id_usera

FROM
rezerwacje r

WHERE
r.dataZalozenia between '2016-01-01' and '2016-07-01'
and r.`status` = 'zabookowana'

ORDER BY
id_usera

两个查询分别运行正常,但当我尝试将它们组合起来时:

SELECT
m.user_id,
date(m.action_date) as data_insert

FROM
mwids m

WHERE
m.`type` = 'insert'

这个查询“无限制地”运行,我必须在一段时间后将其删除。

我不相信应该跑那么久。如果查询号2较小,即大约1M用户,我可以在几秒钟内将结果组合在Excel中。那么为什么在数据库里面不可能呢?我做错了什么?

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT
r.idUsera as id_usera,
t1.data_insert

FROM
rezerwacje r

INNER JOIN
    (
    SELECT
    m.user_id,
    date(m.action_date) as data_insert

    FROM
    mwids m

    WHERE
    m.`type` = 'insert'
    ) t1 ON t1.user_id = r.idUsera

WHERE
r.dataZalozenia between '2016-01-01' and '2016-07-01'
and r.`status` = 'zabookowana'

ORDER BY
id_usera

尝试使用INNER JOIN

希望这会对你有所帮助。

答案 1 :(得分:0)

查询1需要

INDEX(status, dataZalozenia, id_usera)

查询3:重写:

如果mwids中只有一行用于每个用户的“插入”:

SELECT  r.idUsera as id_usera, DATE(m.action_date) AS data_insert
    FROM  rezerwacje r
    LEFT JOIN  mwids m  ON m.user_id = r.idUsera
      AND  m.`type` = 'insert'
    WHERE  r.dataZalozenia >= '2016-01-01'
      AND  r.dataZalozenia  < '2016-01-01' + 12 MONTH
      and  r.`status` = 'zabookowana'
    ORDER BY  r.idUsera

INDEX(status, dataZalozenia, isUsera)   --  on r
INDEX(type, user_id, action_date)       --  on m

如果可以有多行,请执行以下操作:

SELECT  r.idUsera as id_usera, 
        ( SELECT  DATE(m.action_date)
            FROM  mwids m
            WHERE  m.user_id = r.idUsera
              AND  m.`type` = 'insert'
            LIMIT  1 
        ) AS data_insert
    FROM  rezerwacje r
    LEFT JOIN  mwids m  ON m.user_id = r.idUsera
      AND  m.`type` = 'insert'
    WHERE  r.dataZalozenia >= '2016-01-01'
      AND  r.dataZalozenia <  '2016-01-01' + 12 MONTH
      and  r.`status` = 'zabookowana'
    ORDER BY  r.idUsera 

但是你会得到一个随机的action_date。所以也许你想要MIN()MAX()