使用where语句优化MySQL查询
我目前正在处理包含超过100万条记录的大数据库,我正在使用下面的查询根据我的条件填写记录,但速度太慢,即使我索引主键 SQL: 有人能帮我优化查询吗 谢谢 编辑: 表结构:使用where语句优化MySQL查询,mysql,Mysql,我目前正在处理包含超过100万条记录的大数据库,我正在使用下面的查询根据我的条件填写记录,但速度太慢,即使我索引主键 SQL: 有人能帮我优化查询吗 谢谢 编辑: 表结构: CREATE TABLE `products` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `productID` varchar(50) COLLATE utf8_unicode_ci NOT NULL UNIQUE, `catID`
CREATE TABLE `products` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`productID` varchar(50) COLLATE utf8_unicode_ci NOT NULL UNIQUE,
`catID` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`title` text COLLATE utf8_unicode_ci,
`description` longtext COLLATE utf8_unicode_ci,
`productUrl` text COLLATE utf8_unicode_ci NOT NULL,
`regularPrice` double(8,2) DEFAULT NULL,
`salePrice` double(8,2) NOT NULL,
`imageUrl` text COLLATE utf8_unicode_ci NOT NULL,
`merID` varchar(50) COLLATE utf8_unicode_ci NOT NULL UNIQUE,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `advertisers` (
`id` int(10) UNSIGNED NOT NULL PRIMARY KEY,
`advertID` varchar(50) COLLATE utf8_unicode_ci NOT NULL UNIQUE,
`name` text COLLATE utf8_unicode_ci NOT NULL,
`link` text COLLATE utf8_unicode_ci NOT NULL,
`logo` text COLLATE utf8_unicode_ci NOT NULL,
`source` varchar(10) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
说明:
mysql> EXPLAIN EXTENDED SELECT DISTINCT title, productID, catID, description, productUrl, regularPrice, salePrice, imageUrl, merID, created_at, updated_at, name, link, source FROM products p, advertisers a WHERE (title LIKE '%headphone%' OR description LIKE '%headphone%') AND catID=22 AND regularPrice IS NOT NULL AND p.merID = a.advertID;
+----+-------------+-------+------------+--------+---------------------+----------+---------+-------------------+--------+----------+------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------------+----------+---------+-------------------+--------+----------+------------------------------+
| 1 | SIMPLE | p | NULL | ALL | merID | NULL | NULL | NULL | 682242 | 1.89 | Using where; Using temporary |
| 1 | SIMPLE | a | NULL | eq_ref | advertID,advertID_2 | advertID | 152 | datafeeds.p.merID | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------------+----------+---------+-------------------+--------+----------+------------------------------+
2 rows in set, 2 warnings (0.00 sec)
检查产品的连接键merID和广告商的广告ID中的索引
SELECT DISTINCT
title
, productID
, catID
, description
, productUrl
, regularPrice
, salePrice
, imageUrl
, merID
, created_at
, updated_at
, name
, link
, source
FROM products p
INNER JOIN advertisers a ON p.merID = a.advertID
WHERE (title LIKE '%headphone%' OR description LIKE '%headphone%')
AND catID=22
AND regularPrice IS NOT NULL
在(可能)更具选择性的列上使用复合索引是否有用
(catID, merID)
由于like和si not null的使用,regularPrice、title和description在复合索引中不应该有用。MySQL从5.6版开始就支持InnoDB表的全文索引 我建议您使用全文搜索
ALTER TABLE products
ADD FULLTEXT (title, description);
替换
WHERE (title LIKE '%headphone%' OR description LIKE '%headphone%')
到
显示
CREATE TABLE
query使用mysql提供的EXPLAIN
功能。请参阅相关文档。它可以让你准确地理解mysql是如何选择匹配项的,它使用了什么索引以及可能缺少什么。我建议不要使用已经过时了20年的JOIN语法。否则,请确保连接的字段(两侧)也被索引。@ALIOCE,是否存在任何索引?为广告商
表格显示创建表格
也很好。请显示解释结果,因为@arkascha上面说当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用。
我收到此警告此警告。。什么时候显示??你想做什么?“网格编辑、复选框、编辑、复制和删除功能不可用”是什么意思?好消息!不过,我强烈建议您学习建议的EXPLAIN
功能,以便能够自己找到索引问题的解决方案。@aliocee,您只能在右侧使用通配符:反对('heedphant*')
。但你还有其他优势。阅读更多:
WHERE (title LIKE '%headphone%' OR description LIKE '%headphone%')
WHERE MATCH (title, description) AGAINST ('headphone');