使用where语句优化MySQL查询

使用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`

我目前正在处理包含超过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` 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');