MySQL选择优化帮助?
这是我在我的一个站点上经常使用的SELECT查询的一个广泛示例。我们的主机的页面加载速度很慢,这是一个非常糟糕的问题,所以我正在尽我所能优化网站使用的每一段代码。我不是MySQL方面的专家,所以我希望你们中的一些人能有所帮助。这是我试图进一步优化的查询-MySQL选择优化帮助?,mysql,Mysql,这是我在我的一个站点上经常使用的SELECT查询的一个广泛示例。我们的主机的页面加载速度很慢,这是一个非常糟糕的问题,所以我正在尽我所能优化网站使用的每一段代码。我不是MySQL方面的专家,所以我希望你们中的一些人能有所帮助。这是我试图进一步优化的查询- Select ID, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15 From table_1 Whe
Select ID, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15 From table_1
Where Active = '1' And Col2 LIKE '%Cat%' And Col3 <> 'blah' And Col3 <> 'blah1' And Col3 <> 'blah2' And Col3 <> 'blah3' And Col3 <> 'blah4' And Col3 <> 'blah5' And Col3 <> 'blah6'
And ID Not In (Select t2ID From table_2 Where table_2.t2ID = table_1.ID And table_2.Col1 = '1' And table_2.Col2 = '1')
And ID Not In (Select t3ID From table_3 Where table_3.t3ID = table_1.ID And table_3.Col1 = '1')
And ID Not In (Select t4ID From table_4 Where table_4.t4ID = table_1.ID And table_4.Col1 = '1')
基本上,它检查表1、表1,并提取表2、表3和表4中未找到的所有匹配行。我相信除了多个子选择之外,还有一种更有效的方法。非常感谢您的帮助!提前感谢:
更新:基本上我想知道的是,有没有比查询中的多个子选择更快的东西?我确信有某种方法可以从一个表中获得结果,而这个表在多个其他表中并不存在,这比进行子选择要有效得多。。。两个表之间唯一的共同点是,表_1中的ID与其他3个表中的每一个表中的另一列相同,这就是我目前正在使用子选择项对其进行检查的内容。不幸的是,我只是不知道做这个查询更有效的方法是什么。。。感谢大家迄今为止的投入
表格布局
mysql> show create table campaigns\G
*************************** 1. row ***************************
Table: campaigns
Create Table: CREATE TABLE `campaigns` (
`ID` int(11) NOT NULL auto_increment,
`CreatedOn` datetime NOT NULL,
`AddedBy` varchar(75) default NULL,
`pCampaignName` varchar(255) default NULL,
`CampaignName` varchar(255) default NULL,
`CampaignValue` decimal(65,2) default '0.00',
`CampaignPayout` decimal(65,2) NOT NULL default '0.00',
`CampaignT` double NOT NULL default '0',
`CampaignSD` double NOT NULL default '0',
`ReportingTime` varchar(255) default NULL,
`CampaignExpiration` varchar(100) default NULL,
`DurationType` varchar(100) default NULL,
`Countries` varchar(100) default NULL,
`CampaignDescription` longtext,
`CampaignRequirements` longtext,
`CampaignType` varchar(50) default NULL,
`CampaignID` varchar(255) default NULL,
`BannerImageWidth` int(10) NOT NULL default '0',
`BannerImageHeight` int(10) NOT NULL default '0',
`BannerImageURL` varchar(255) default NULL,
`BannerImageAlternateText` varchar(255) default NULL,
`DisplayBanner` int(1) NOT NULL default '0',
`CampaignCode` longtext,
`CampaignURL` longtext,
`CampaignActive` int(1) NOT NULL default '0',
`Status` varchar(255) default NULL,
`Affiliate` varchar(255) default NULL,
`NewOfferEmailSent` int(1) unsigned NOT NULL default '0',
`NumberApproved` double(65,2) NOT NULL default '0.00',
`NumberLeads` double NOT NULL default '0',
`ThumbsUp` double NOT NULL default '0',
`ThumbsDown` double NOT NULL default '0',
`CampaignPoints` double NOT NULL default '0',
`UserRatingUp` double NOT NULL default '0',
`UserRatingDown` double NOT NULL default '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=1608 DEFAULT CHARSET=utf8
1 row in set (0.09 sec)
mysql> show indexes from campaigns\G
*************************** 1. row ***************************
Table: campaigns
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 1596
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
1 row in set (0.10 sec)
mysql>
mysql> show create table acampaigns\G
*************************** 1. row ***************************
Table: acampaigns
Create Table: CREATE TABLE `acampaigns` (
`ID` int(11) NOT NULL auto_increment,
`CreatedOn` datetime NOT NULL,
`CampaignName` varchar(255) default NULL,
`CampaignRequirements` longtext,
`CampaignURL` longtext,
`CampaignValue` decimal(65,2) NOT NULL,
`CampaignPayout` decimal(65,2) NOT NULL,
`CampaignReferralCommissionTier1` decimal(65,2) NOT NULL default '0.20',
`CampaignReferralCommissionTier2` decimal(65,2) NOT NULL default '0.10',
`CampaignT` double NOT NULL default '0',
`CampaignSD` double NOT NULL default '0',
`CampaignType` varchar(255) default NULL,
`CampaignID` varchar(100) default NULL,
`CampaignExpiration` varchar(100) default NULL,
`CampaignReturnStatus` varchar(100) default NULL,
`CampaignStatus` varchar(255) default NULL,
`pCampaignID` int(11) NOT NULL,
`pCampaignName` varchar(255) default NULL,
`pUserID` int(11) NOT NULL,
`pUsername` varchar(75) default NULL,
`pUserIPAddress` varchar(30) default NULL,
`ApprovedOn` datetime NOT NULL,
`MarkedDone` int(1) NOT NULL default '0',
`Notes` longtext,
`PaidOn` datetime default NULL,
`cBonus` decimal(65,2) NOT NULL default '0.00',
`ReversedReason` varchar(255) default NULL,
`CampaignPoints` double NOT NULL default '0',
`Affiliate` varchar(255) default NULL,
`RC1Paid` int(1) unsigned NOT NULL default '0',
`RC2Paid` int(1) unsigned NOT NULL default '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=10996 DEFAULT CHARSET=utf8
1 row in set (0.44 sec)
mysql> show indexes from acampaigns\G
*************************** 1. row ***************************
Table: acampaigns
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 8936
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
1 row in set (0.09 sec)
mysql>
mysql> show create table bcampaigns\G
*************************** 1. row ***************************
Table: bcampaigns
Create Table: CREATE TABLE `bcampaigns` (
`ID` int(11) NOT NULL auto_increment,
`CreatedOn` datetime NOT NULL,
`pCampaignID` int(11) NOT NULL,
`ReportedByUserID` int(11) NOT NULL,
`Status` varchar(255) default NULL,
`Notes` longtext,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=375 DEFAULT CHARSET=utf8
1 row in set (0.08 sec)
mysql> show indexes from bcampaigns\G
*************************** 1. row ***************************
Table: bcampaigns
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
1 row in set (0.08 sec)
mysql>
mysql> show create table icampaigns\G
*************************** 1. row ***************************
Table: icampaigns
Create Table: CREATE TABLE `icampaigns` (
`ID` int(11) NOT NULL auto_increment,
`CreatedOn` datetime NOT NULL,
`pCampaignID` int(11) default NULL,
`IgnoredByUserID` int(11) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=567 DEFAULT CHARSET=utf8
1 row in set (0.09 sec)
mysql> show indexes from icampaigns\G
*************************** 1. row ***************************
Table: icampaigns
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: ID
Collation: A
Cardinality: 532
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
1 row in set (0.40 sec)
mysql>
mysql> explain Select ID, CreatedOn, pCampaignName,
CampaignName, CampaignRequirements, CampaignURL, Countries,
CampaignPayout, CampaignPoints, CampaignT, CampaignSD, CampaignType,
ReportingTime, NumberApproved, NumberLeads
From campaigns
-> Where CampaignActive = '1' And CampaignType LIKE 'Cat%'
And CampaignType <> 'DS' And CampaignType <> 'CC' And CampaignType <> 'PC'
And CampaignType <> 'PC2' And CampaignType <> 'GCC' And CampaignType <> 'G'
And CampaignType <> 'R'
-> And ID Not In (Select pCampaignID From acampaigns
Where campaigns.ID = acampaigns.pCampaignID And MarkedDone = '1' And campaigns.pUserID = '1')
-> And ID Not In (Select pCampaignID From bcampaigns
Where bcampaigns.pCampaignID = campaigns.ID And bcampaigns.ReportedByUserID = '1')
-> And ID Not In (Select pCampaignID From icampaigns
Where icampaigns.pCampaignID = campaigns.ID And icampaigns.IgnoredByUserID = '1')
你试过解释你的疑问吗。如果您不熟悉EXPLAIN,它将生成一个报告,显示如何执行查询,特别是使用了哪些索引,并且可能会显示需要索引但不存在索引的位置 我还发现,在过去,不参与有时会非常缓慢。也许重写“不存在即不存在”可能会加快速度
NOT EXISTS (SELECT *
FROM table_3
WHERE table_3.t3ID = table_1.ID AND
table_3.Col1 = '1')
IDFMA
请发布以下脚本的结果,以便我们可以详细分析您的查询。如果你也能把结果贴在上面,那就太好了
谢谢
show create table table_1\G
show indexes from table_1\G
show create table table_2\G
show indexes from table_2\G
show create table table_3\G
show indexes from table_3\G
show create table table_4\G
show indexes from table_4\G
explain
Select
ID, Col1, Col2, Col3, Col4, Col5, Col6, Col7,
Col8, Col9, Col10, Col11, Col12, Col13, Col14, Col15
From
table_1
Where
Active = '1' And
Col2 LIKE '%Cat%' And Col3 <> 'blah' And Col3 <> 'blah1' And Col3 <> 'blah2' And Col3 <> 'blah3' And
Col3 <> 'blah4' And Col3 <> 'blah5' And Col3 <> 'blah6' And
ID Not In (Select t2ID From table_2 Where table_2.t2ID = table_1.ID And table_2.Col1 = '1' And table_2.Col2 = '1') And
ID Not In (Select t3ID From table_3 Where table_3.t3ID = table_1.ID And table_3.Col1 = '1') And
ID Not In (Select t4ID From table_4 Where table_4.t4ID = table_1.ID And table_4.Col1 = '1');
您可以将这个查询拆分为多个单独的步骤,并使用临时表将它们放在单个存储过程中。这将使它更具可读性,并且可能运行得更快……将NOT IN更改为NOT EXISTS似乎是相同的速度,没有显著差异。另外,我解释了查询,它返回的主要是null。表1的读数不到1500行,表2的读数刚刚超过7000行,其他两个表的读数不到500行。除表名和选择类型之外的所有其他内容都为空。我试图构造一个连接查询,它将拉取相同的数据,只是为了看看它是否会更快,但似乎无法得到一个不会抛出错误的连接查询,并获取相同的数据。谢谢你迄今为止的帮助!此代码给出了指向“显示创建表表\u 1\G”和“显示表\u 1\G中的索引”的错误。这可能有助于使用您请求的结果编辑主帖。此查询将由数千名成员每天运行数千次,这就是为什么首先需要优化的原因。我可能错了,但是拆分这个查询会不会占用数据库服务器上更多的资源?