Php mysql中的覆盖索引和两个表

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

我有两个表(新产品和旧产品)正在进行比较。新产品约有68000条记录,旧产品约有51000条。我在每个表上使用覆盖索引,但是查询需要20分钟才能执行,所以我没有正确地使用它。覆盖索引真的适用于多个表吗?我做错了什么?多谢各位

这是我的查询代码和索引:

$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`)