2015-04-28 126 views
2

我想從MySQL獲取一些用戶統計信息。喜歡的東西:如何優化多個子查詢?

  • 10%的用戶購買了百事可樂
  • 20%是女人
  • 40%是在美國

的第一步是獲取所有用戶的列表已經從百事買了東西製造商。

此查詢在1秒內​​運行良好,並返回用戶標識列表。

SELECT DISTINCT idUser FROM checkout_item INNER JOIN (
    SELECT id FROM product WHERE manufacturer = "pepsi" 
) AS chkItem ON chkItem.id = checkout_item.idProduct 

現在我使用此列表獲取信息。剛剛在上面添加了一個查詢:

SELECT 
    name, gender 
FROM users INNER JOIN(

    SELECT DISTINCT idUser FROM checkout_item INNER JOIN ( // 
    SELECT id FROM product WHERE manufacturer = "pepsi" // same query above 
) AS chkItem ON chkItem.id = checkout_item.idProduct  // 

) AS usr ON usr.idUser = users.id 

此查詢正在工作,但它需要23秒。有什麼辦法可以優化嗎?

也許使用WHEREs,JOINs或更改mysql RAM配置?

+2

您的表格是否編入索引? – vaso123

+0

謝謝@lolka_bolka,我在NAME和GENDER字段創建了索引,現在需要2秒。 – anderlaini

+1

我很難相信名稱和性別的索引會有幫助,因爲它們不包含在任何過濾參數中。查詢是否發生了與您發佈的查詢不同的查詢? –

回答

1

這是對第一個查詢的重寫。也許你可以弄清楚其餘的。

SELECT DISTINCT idUser 
      FROM checkout_item i 
      JOIN product p 
      ON p.id = i.idproduct 
      WHERE p.manufacturer = 'pepsi' 
0

嘗試這種情況: 選擇名稱,從checkout_item℃的內部(從產品選擇ID WHERE製造商= 「百事可樂」)JOIN P於p.id = C.idProduct INNER JOIN用戶U ON C.性別 ID用戶= u.Id

還可考慮在指數上checkout_item場idProduct的

0

下面應該給你idUsers的總數,idUsers誰是女性總數(很明顯,我不知道你用什麼作爲性別的標誌,所以我剛剛使用'f')。

SELECT COUNT(DISTINCT idUser) AS Total, 
    COUNT(DISTINCT CASE WHEN gender = 'f' then idUser else null end) AS women 
FROM checkout_item ci 
    inner join product p 
     on p.id=ci.idProduct 
WHERE p.manufacturer = 'pepsi' 

從那裏它應該是基本的數學得到你需要的數字。

通常我不會推薦使用'DISTINCT',但是不太瞭解您的數據,這是快速和骯髒的方式,使一些工作。

希望有幫助!