搜索此类数据库结构的最佳方法


Best way to search this type of database structure?

这是我的数据库结构的一个例子,我想知道创建搜索函数的最佳和最快的方法。

orders_users表:

id || order_id || title || first_name || last_name || email || telephone

orders_details表:

id || transaction_id || date_time || status

目前我进行以下查询:

SELECT * FROM orders_users WHERE last_name = '%QUERY%'

在此之后,我对第一个查询的结果执行 PHP foreach,以查询第二个表中的date_time和状态。(这对于我的搜索结果页面是必需的)

SELECT * FROM orders_details WHERE id = '%ORDER_ID FROM FIRST QUERY%'

这对于不常见的名字很好,但如果我在大约 80k 行上搜索"smith",它可以理解地很慢。

我想到的唯一另一种方法是使用可搜索的列和结果填充一个单独的表,这些列和结果只需要一个查询,如下所示:

id || order_id || last_name || date_time || status

如果可能的话,我宁愿不走这条路,因为我真的不想使用相同的数据更新多个表。

敢肯定我的头脑不会直接思考这个问题,我只需要一点指导。

您始终可以通过以下方式将两个表连接在一起:

SELECT O.id as id, D.id as order_id, last_name, date_time, status 
FROM orders_users as O LEFT JOIN orders_details as D 
ON O.id = D.id
WHERE last_name LIKE '%QUERY%'

在sql中搜索非常快,因此您不必担心spl搜索的速度。以防万一,如果您只想按last_name进行搜索,我建议您在此列中添加索引,它有助于搜索速度,但不能提高插入或删除速度。

你需要学习如何学习JOIN是如何工作的。

SELECT u.order_id, u.last_name, d.date_time, d.status
FROM orders_users u INNER JOIN orders_details d
  ON u.order_id = d.id

您将使用如下所示的内部连接

SELECT ou.id, 
       ou.order_id, 
       ou.last_name, 
       od.date_time, 
       od.status 
  FROM orders_users ou
 INNER JOIN orders_details od 
    ON od.id = ou.order_id 
 WHERE ou.last_name = '%QUERY%'