2016-01-08 67 views
0

我的SQL查詢需要更多時間從mysql數據庫服務器執行。有一些表與sb_tblproperty表連接在一起。 sb_tblproperty是包含超過1,00,000行的主表。大部分表格包含50,000行。Mysql太多的時間來執行基於多個連接的sql查詢

如何優化我的sql查詢以快速執行。我也用過索引。

indexingExplain - query - structure

SELECT `t1`.`propertyId`, `t1`.`projectId`, 
`t1`.`furnised`, `t1`.`ownerID`, `t1`.`subType`, 
`t1`.`fors`, `t1`.`size`, `t1`.`unit`, 
`t1`.`bedrooms`, `t1`.`address`, `t1`.`dateConfirm`, 
`t1`.`dateAdded`, `t1`.`floor`, `t1`.`priceAmount`, 
`t1`.`priceRate`, `t1`.`allInclusive`, `t1`.`booking`, 
`t1`.`bookingRate`, `t1`.`paidPercetage`, 
`t1`.`paidAmount`, `t1`.`is_sold`, `t1`.`remarks`, 
`t1`.`status`, `t1`.`confirmedStatus`, `t1`.`source`, 
`t1`.`companyName` as company, `t1`.`monthly_rent`, 
`t1`.`per_sqft`, `t1`.`lease_duration`, 
`t1`.`lease_commencement`, `t1`.`lock_in_period`, 
`t1`.`security_deposit`, `t1`.`security_amount`, 
`t1`.`total_area_leased`, `t1`.`lease_escalation_amount`, 
`t1`.`lease_escalation_years`, `t2`.`propertyTypeName` as 
propertyTypeName, `t3`.`propertySubTypeName` subType, 
`t3`.`propertySubTypeId` subTypeId, `Owner`.`ContactName` 
ownerName, `Owner`.`companyName`, `Owner`.`mobile1`, 
`Owner`.`otherPhoneNo`, `Owner`.`mobile2`, 
`Owner`.`email`, `Owner`.`address` as caddress, 
`Owner`.`contactType`, `P`.`projectName` as project, 
`P`.`developerName` as developer, `c`.`name` as city, 
if(t1.projectId="", group_concat(distinct(L.locality)), 
group_concat(distinct(L2.locality))) as locality, `U`.`firstname` 
addedBy, `U1`.`firstname` confirmedBy 
FROM `sb_tblproperty` as t1 
JOIN `sb_contact` Owner ON `Owner`.`id` = `t1`.`ownerID` 
JOIN `tbl_city` C ON `c`.`id` = `t1`.`city` 
JOIN `sb_propertytype` t2 ON `t1`.`propertyType`= `t2`.`propertyTypeId` 
JOIN `sb_propertysubtype` t3 ON `t1`.`subType` =`t3`.`propertySubTypeId` 
LEFT JOIN `sb_tbluser` U ON `t1`.`addedBy` = `U`.`userId` 
LEFT JOIN`sb_tbluser` U1 ON `t1`.`confirmedBy` = `U1`.`userId` 
LEFT JOIN `sb_tblproject` P ON `P`.`id` = `t1`.`projectId` LEFT 
JOIN `sb_tblpropertylocality` PL ON `t1`.`propertyId` = `PL`.`propertyId` 
LEFT JOIN `sa_localitiez` L ON `L`.`id` = `PL`.`localityId` 
LEFT JOIN `sb_tblprojectlocality` PROL ON `PROL`.`projectId` = `P`.`id` 
LEFT JOIN `sa_localitiez` L2 ON `L2`.`id` = `PROL`.`localityId` 
LEFT JOIN `sb_tblfloor` F 
ON `F`.`floorName` =`t1`.`floor` 
WHERE `t1`.`is_sold` != '1' GROUP BY `t1`.`propertyId` 
ORDER BY `t1`.`dateConfirm` 
DESC LIMIT 1000 
+0

你應該添加表結構,索引列表和查詢執行計劃(與EXPLAIN ),如果你希望人們幫助.. 。 – Olli

+0

嘗試[說明](http://dev.mysql.com/doc/refman/5.7/en/using-explain.html)查詢它是否使用索引。如果沒有,你必須創建betetr索引 –

+0

你有'sb_tblfloor.floorName'上的索引嗎? – Olli

回答

0

請提供EXPLAIN

同時,試試這個:

SELECT ... 
    FROM (
     SELECT propertyId 
      FROM sb_tblproperty 
      WHERE `is_sold` = 0 
      ORDER BY `dateConfirm` DESC 
      LIMIT 1000 
     ) AS x 
    JOIN `sb_tblproperty` as t1 ON t1.propertyId = x.propertyId 
    JOIN `sb_contact` Owner ON `Owner`.`id` = `t1`.`ownerID` 
    JOIN `tbl_city` C ON `c`.`id` = `t1`.`city` 
    ... 
    LEFT JOIN `sb_tblfloor` F ON `F`.`floorName` =`t1`.`floor` 
    ORDER BY `t1`.`dateConfirm` DESC -- yes, again 

加上

INDEX(is_sold, dateConfirm) 

哪有t1.projectId = 「」? projectId是不是PRIMARY KEY? (這是很多原因需要的SHOW CREATE TABLE之一。)

如果我的建議會導致「重複」行(即具有相同propertyId多行),不要簡單地加回GROUP BY propertyId。相反,找出原因,並避免需要GROUP BY。 (這可能是性能問題。)

可能的情況是GROUP_CONCAT。一個常見的解決方法是從

GROUP_CONCAT(distinct(L.locality)) AS Localities, 
... 
LEFT JOIN `sa_localitiez` L ON `L`.`id` = `PL`.`localityId` 

改變

(SELECT GROUP_CONCAT(distinct locality) 
     FROM sa_localitiez 
     WHERE id = PL.localityId) AS Localities 
... 
# and remove the JOIN 
+0

嗨,@Rick Jame這裏的鏈接解釋結構 [鏈接](http://i.stack.imgur.com/dez5t.jpg) – Dharma

+0

你沒有使用F呢?擺脫「LEFT JOIN'sb_tblfloor' F ON'F'.'floorName' ='t1'.'floor'」它似乎只是在浪費時間。 –