//样例只保留了部分关键字段。
//表一 9万多条数据
CREATE TABLE a_itemsListVer
(id
varchar(20) NOT NULL,
itemsListId
varchar(20) NOT NULL COMMENT '主项目id',waterproof
varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (id
),
KEY fId
(itemsListId
),
KEY waterproof
(waterproof
) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
//样例数据 INSERT INTO a_itemsListVer
VALUES ('zgypu9zqg5ys', 'vs6h24c5b79w', '防水卷材');
//表二 8万多条数据
CREATE TABLE a_itemsListOtherVer
(id
varchar(20) NOT NULL COMMENT 'itemsListVerId相同',itemsListId
varchar(20) NOT NULL COMMENT '主项目id',waterproofMemo
varchar(200) NOT NULL DEFAULT '',
updateTime
datetime NOT NULL COMMENT '更新时间',time
datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (id
),
KEY itemsListId
(itemsListId
),
KEY waterproofMemo
(waterproofMemo
) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
//样例数据 INSERT INTO a_itemsListOtherVer
VALUES ('zgzrzulitiid', 'vs6h24c5b79w', '防水卷材', '2022-6-16 11:06:41', '2022-6-16 11:06:46');
SELECT COUNT(*) FROM a_itemsListVer WHERE ( if(locate('防水材料,防水卷材', waterproof)>0 , true ,
if(
locate ((SELECT GROUP_CONCAT(waterproofMemo) FROM a_itemsListOtherVer WHERE itemsListId=a_itemsListVer.itemsListId ),'防水卷材' )>0
,true,0 ) ) )
1、子查询换连接查询。
2、查看执行计划,看下是否有走索引,跑几分钟,肯定没索引或者索引失效。
数据量并不大,优化优先考虑建立索引吧
换成左连吧,用in的子查询肯定要慢很多的
采用多线程查询试试
SELECT * FROM a_itemsListVer WHERE (locate('防水材料,防水卷材', waterproof) > 0 OR exists (SELECT 1 FROM a_itemsListOtherVer WHERE locate('防水卷材', waterproofMemo) > 0 ) and a_itemsListVer.itemsListId = a_itemsListOtherVer.itemsListId)
SELECT
COUNT(*)
FROM
a_itemsListVer as a
WHERE
LOCATE('防水材料,防水卷材', waterproof) > 0
OR EXISTS( SELECT
*
FROM
a_itemsListOtherVer as b
WHERE
a.itemsListId = b.itemsListId
AND LOCATE(b.waterproofMemo, '防水卷材') > 0)