2015-12-04 84 views
0

這個mysql查詢是非常緩慢的,當我看着它是「複製到tmp表」查詢。這些表是非常大特別是search_attribute(79萬行)和search_attribute_values(350,000行)緩慢的MySQL查詢「複製到tmp表」,幫助重寫它

SELECT attributenames.name, search_attribute_values.value 
FROM attributenames, categorysearchattributes, search_attribute, search_attribute_values 
WHERE 
categorysearchattributes.attributeid = attributenames.attributeid AND categorysearchattributes.categoryid = 4800 AND 
categorysearchattributes.attributeid = search_attribute.attributeid AND 
search_attribute.valueid = search_attribute_values.valueid AND 
attributenames.localeid = 1 
GROUP BY search_attribute.valueid 

Here is a picture of the EXPLAIN of the query

這裏是我的數據庫架構

-- MySQL dump 10.13 Distrib 5.5.46, for debian-linux-gnu (x86_64) 
-- 
-- Host: localhost Database: 
-- ------------------------------------------------------ 
-- Server version 5.5.46-0ubuntu0.14.04.2 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 



-- 
-- Table structure for table `attributenames` 
-- 

DROP TABLE IF EXISTS `attributenames`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `attributenames` (
    `attributeid` bigint(20) NOT NULL DEFAULT '0', 
    `name` varchar(110) NOT NULL DEFAULT '', 
    `localeid` int(11) NOT NULL DEFAULT '0', 
    KEY `attributenames_attributeID` (`attributeid`), 
    KEY `attributenames_localeID` (`localeid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 


-- 
-- Table structure for table `categorysearchattributes` 
-- 

DROP TABLE IF EXISTS `categorysearchattributes`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `categorysearchattributes` (
    `categoryid` int(11) NOT NULL DEFAULT '0', 
    `attributeid` bigint(20) NOT NULL DEFAULT '0', 
    `isactive` tinyint(1) NOT NULL DEFAULT '1', 
    KEY `caterysearchattributes_aID` (`attributeid`), 
    KEY `caterysearchattributes_cID` (`categoryid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Table structure for table `product` 
-- 

DROP TABLE IF EXISTS `product`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `product` (
    `productid` int(11) NOT NULL DEFAULT '0', 
    `manufacturerid` int(11) NOT NULL DEFAULT '0', 
    `isactive` tinyint(1) NOT NULL DEFAULT '1', 
    `mfgpartno` varchar(70) NOT NULL DEFAULT '', 
    `categoryid` int(11) NOT NULL DEFAULT '0', 
    `isaccessory` tinyint(1) NOT NULL DEFAULT '0', 
    `equivalency` double NOT NULL DEFAULT '0', 
    `creationdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `modifieddate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `lastupdated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`productid`), 
    KEY `product_manufacturerID` (`manufacturerid`), 
    KEY `product_categoryID` (`categoryid`), 
    KEY `product_mfgPartNo` (`mfgpartno`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Table structure for table `search_attribute` 
-- 

DROP TABLE IF EXISTS `search_attribute`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `search_attribute` (
    `productid` int(11) NOT NULL DEFAULT '0', 
    `attributeid` bigint(20) NOT NULL DEFAULT '0', 
    `valueid` int(11) NOT NULL DEFAULT '0', 
    `localeid` int(11) NOT NULL DEFAULT '0', 
    `setnumber` tinyint(2) NOT NULL DEFAULT '0', 
    `isactive` tinyint(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`productid`,`localeid`,`attributeid`,`setnumber`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Table structure for table `search_attribute_values` 
-- 

DROP TABLE IF EXISTS `search_attribute_values`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `search_attribute_values` (
    `valueid` int(11) NOT NULL DEFAULT '0', 
    `value` varchar(255) NOT NULL DEFAULT '', 
    `absolutevalue` double NOT NULL DEFAULT '0', 
    `unitid` int(11) NOT NULL DEFAULT '0', 
    `isabsolute` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`valueid`), 
    KEY `search_attrval_value` (`value`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Added attributeid_valueid index

回答

1

通過查看圖片中的EXPLAIN查詢,表search_attribute正在進行全表掃描,即不使用索引。

將索引添加到valueid列的search_attribute表應該使其更快。嘗試一下並在添加索引後分享您的結果。

ALTER TABLE `search_attribute` ADD KEY `idx_valueid` (`valueid`); 

請嘗試以下建議的組合。

+0

編輯我原來的帖子,包括模式 – Aaron

+0

您可以嘗試添加索引按照我的文章。 – Samir

+0

我加了那個索引,它的速度還是很慢的 – Aaron