Php mysql中的覆盖索引和两个表
我有两个表(新产品和旧产品)正在进行比较。新产品约有68000条记录,旧产品约有51000条。我在每个表上使用覆盖索引,但是查询需要20分钟才能执行,所以我没有正确地使用它。覆盖索引真的适用于多个表吗?我做错了什么?多谢各位 这是我的查询代码和索引:Php mysql中的覆盖索引和两个表,php,mysql,database,optimization,covering-index,Php,Mysql,Database,Optimization,Covering Index,我有两个表(新产品和旧产品)正在进行比较。新产品约有68000条记录,旧产品约有51000条。我在每个表上使用覆盖索引,但是查询需要20分钟才能执行,所以我没有正确地使用它。覆盖索引真的适用于多个表吗?我做错了什么?多谢各位 这是我的查询代码和索引: $querystring = "SELECT newProducts.Id, newProducts.SKU, newProducts.Title, oldProducts.Title, oldProducts.product_Id
$querystring = "SELECT newProducts.Id, newProducts.SKU,
newProducts.Title, oldProducts.Title, oldProducts.product_Id
FROM
newProducts, oldProducts
WHERE
trim(newProducts.SKU)=trim(oldProducts.SKU) and
trim(newProducts.Title)=trim(oldProducts.Title) and
oldProducts.Position=1 and
oldProducts.Customer=$shop";
Indexes for NewProducts:
Primary: Id
Index: SKU, Title, customer (not unique)
Indexes for OldProducts:
Primary: Id
Index: Product_id (not unique)
Index: SKU, Title, Postition, Customer (not unique)
?>
CREATE TABLE `NewProducts` (
`Id` bigint(11) NOT NULL,
`Title` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`Category` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`Office` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
`Rehashed` smallint(6) NOT NULL,
`Quantity` smallint(6) NOT NULL,
`Price1` decimal(7,2) NOT NULL,
`Price2` decimal(7,2) NOT NULL,
`Price3` decimal(7,2) NOT NULL,
`Price4` decimal(7,2) NOT NULL,
`created_at` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`OldQuantity` int(11) NOT NULL,
`SKU` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`Source` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
`customer` varchar(70) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `I-T-S` (`ItemId`,`Title`,`SKU`),
KEY `customer` (`customer`),
KEY `Title` (`Title`,`Rehashed`),
KEY `SKU` (`SKU`),
KEY `Title_2` (`Title`,`SKU`,`customer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `OldProducts` (
`barcode` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`compare_at_price` decimal(10,2) DEFAULT NULL,
`created_at` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
`fulfillment` varchar(35) COLLATE utf8_unicode_ci DEFAULT NULL,
`grams` decimal(10,2) DEFAULT NULL,
`id` bigint(11) NOT NULL,
`management` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`policy` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`size` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`color` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`type` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`position` int(11) DEFAULT NULL,
`price` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`product_id` bigint(11) NOT NULL,
`SKU` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL,
`Title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`customer` varchar(70) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `P-S-T-PO-CUST`
(`product_id`,`SKU`,`Title`,`position`,`customer`),
KEY `product_id` (`product_id`),
TRIM
是个恶棍。在函数(例如,TRIM
)中隐藏索引列(例如,SKU
)时,无法使用索引
清理您的数据:
TRIM
更新tbl集合SKU=TRIM(SKU),title=TRIM(title)代码>--对于每个表
选择
:修剪(SKU)
-->SKU
等旧产品
应按此顺序
这样,
WHERE
只需查看position=1和customer=…
的old
行。(实际上,前2列可以是任意顺序;后3列可以是任意顺序。)什么是SKU?我不理解这个字段。您应该展示您现有的表架构,以及创建的索引,甚至可能显示内容摘录。还可以使用EXPLAIN
显示查询计划。似乎应该清理存储的ID并使用真正的连接,而不是WHERE子句映射。(虽然我们的SQL“人”通常可以推断出这样的事情,但如果您尽可能多地包含细节,它对未来的用户更有用。)很难做到。。。。显然,我在这里使用别名。基本上,一个表已经被转换成另一个表,我正在寻找匹配的记录来验证其他的东西。这是可行的,但速度比见鬼还慢,我正在努力加快速度。不同的是,在每个数据库中有10000条记录,它运行得非常快。不知道为什么会在这里慢下来。显示第0-29行(总共47977行,查询耗时0.0020秒)。狗娘养的……好吧,快一点。谢谢,先生,修剪确实是个问题。谢谢。你是我的英雄。:)
`INDEX(`position`,`customer` ,`SKU`,`Title`, `product_id`)