【问题标题】:How to speed up my MySQL query with full-text如何使用全文加速我的 MySQL 查询
【发布时间】:2020-06-09 12:38:57
【问题描述】:

我有 2 张桌子。

  1. special_order(订单表)- 有 420 000 个数据
  2. special_order_product(产品表)与 order_id 链接到 special_order 表。有 1 000 000 条数据

数据库存储引擎:InnoDB

我试图找到具有左连接关键字的产品的订单。查询需要 10-15 秒。另外,我对 product_link 列的其他索引(special_order.id, special_order_product.order_id)使用全文索引

SPECIAL_ORDER 表: Table structure

特殊订购产品表: Table structure

查询:

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 秒)

查询说明: Explain of the query

special_order 表的索引: Special order table indexes

special_order_product 表的索引: enter image description here

【问题讨论】:

  • 正确信息,只是作为图片链接很难阅读。 SHOW CREATE TABLE {tablename} 是一种更简单的读取表/索引结构的方法。 sqlformat.org 使更长的查询实际上可读。欢迎来到 SO。这可能会移至 dba.stackexchange.com。握紧,您可以编辑您的问题。
  • 你能在问题中添加查询信息吗?
  • @danblack 我添加了你想要的图片。
  • @Vidal 添加了查询信息和查询说明
  • 不明确 -- 两个表都有created_at,那么应该是哪个ORDER BY??

标签: mysql optimization full-text-search innodb


【解决方案1】:
  • 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 项,然后停止。
  • 因此,对so 的探测只有 30 个。
  • 我认为不需要重复数据删除。
  • ORDER BY 被重复(排序),因为子查询在被外部查询使用时没有顺序。但是LIMIT 需要对数据进行排序。

需要的索引(其他的在这里没用):

p: FULLTEXT(product_link)
so: (id)  -- the PRIMARY KEY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多