mysql - 如何使用全文加速我的 MySQL 查询
问题描述
我有 2 张桌子。
- special_order(订单表)- 有 420 000 个数据
- 与 order_id 链接到 special_order 表的 special_order_product(产品表)。有 1 000 000 个数据
数据库存储引擎:InnoDB
我试图根据带有左连接的关键字查找具有产品的订单。查询需要 10-15 秒。另外,我对 product_link 列使用全文索引其他索引(special_order.id,special_order_product.order_id)
SPECIAL_ORDER TABLE: 表结构
特殊订单产品表: 表结构
查询:
SELECT distinct(special_order.id), special_order.admin_id, special_order.user_id,
special_order.total_price, special_order.created_at, special_order.updated_at
FROM special_order LEFT JOIN special_order_product
ON special_order.id = special_order_product.order_id
WHERE MATCH(product_link) AGAINST ('trendyol' IN BOOLEAN MODE)
order by created_at desc limit 30
结果:集合 30 行(15.730 秒)
查询解释:查询 解释
特殊订单表上的索引: 特殊订单表索引
special_order_product 表上的索引: 在此处输入图像描述
解决方案
DISTINCT
不是函数;它将删除一组SELECT
列。- 您似乎想找到
product_link
值,但您说它是选项 (LEFT
)。也许LEFT
是错的?
建议改写如下:
SELECT so.id, so.admin_id, so.user_id, so.total_price,
so.created_at, so.updated_at
FROM ( SELECT p.order_id
FROM special_order_product AS p
WHERE MATCH(p.product_link) AGAINST ('trendyol' IN BOOLEAN MODE)
order by p.created_at desc
limit 30
) AS p2
JOIN special_order AS so ON so.id = p2.order_id
order by so.created_at desc
笔记:
- 派生表(子查询)专注于获取 30 个项目,然后停止。
- 因此,只有 30 次探测
so
。 - 我认为不需要重复数据删除。
- 重复(某种程度)是因为子查询在
ORDER BY
被外部查询使用时没有顺序。但LIMIT
需要对数据进行排序。
需要的索引(其他的在这里没用):
p: FULLTEXT(product_link)
so: (id) -- the PRIMARY KEY
推荐阅读
- python - os.system 功能不会清屏
- azure-service-fabric - Azure Service Fabric - 大型跟踪日志文件夹
- r - 事件矩阵名称提取所有 TRUE
- http - HTTP 用户/密码抓取混乱
- python - 如何比较两个熊猫数据框并删除一个文件上的重复项而不附加其他文件中的数据
- r - 将 aa 字符列转换为具有多种格式的日期
- scala - 如何缩小列表但保证它不为空?
- maven - 无法使用 Maven Archetype 为 opendaylight 创建项目
- performance - 在 Ubuntu 16.04 上输入时 Android Studio 变得迟钝
- php - 在 laravel 中找不到类路径