我有一个搜索查询,该查询使用一些联接在不同的关联表中进行搜索。但是最近我在contactpersonen表中添加了约3000个联系人。而且真的很慢。

这些表是:
借方:1445个条目
contactpersonen:3711个条目
debiteuren_toegang:3008个条目

    SELECT
    contactpersonen.id,
    contactpersonen.voornaam,
    contactpersonen.achternaam,
    debiteuren.bedrijfsnaam,
    debiteuren.id as debid
FROM
    debiteuren
        LEFT JOIN
    contactpersonen ON contactpersonen.bedrijf = debiteuren.id
        LEFT JOIN
    debiteuren_toegang ON debiteuren_toegang.bedrijf = debiteuren.id
WHERE
    (contactpersonen.voornaam LIKE '%henk%'
        OR contactpersonen.achternaam LIKE '%henk%'
        OR debiteuren.id LIKE '%henk%'
        OR debiteuren.bedrijfsnaam LIKE '%henk%'
        OR contactpersonen.id LIKE '%henk%')
        AND debiteuren_toegang.website = 'web1'
LIMIT 10


当我删除要搜索contactpersonen.voornaam LIKE '%henk%' OR contactpersonen.achternaam LIKE '%henk%'的部分时,查询实际上又很快了。

香港专业教育学院在voornaam和achternaam上的phpmyadmin中添加了一个索引,但这没有任何帮助。

关于如何使其更快的想法?我不认为这是很多行吧?查询有时甚至持续5秒钟。

谢谢!

完整查询说明:

+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
| id | select_type |       table        |  type  | possible_keys |   key   | key_len |                  ref                  | rows |    Extra    |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
|  1 | SIMPLE      | debiteuren_toegang | ALL    | NULL          | NULL    | NULL    | NULL                                  | 3008 | Using where |  |
|  1 | SIMPLE      | debiteuren         | eq_ref | PRIMARY       | PRIMARY | 4       | deb12311_1.debiteuren_toegang.bedrijf |    1 |             |  |
|  1 | SIMPLE      | contactpersonen    | ALL    | NULL          | NULL    | NULL    | NULL                                  | 4169 | Using where |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+


部分查询说明:

+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
| id | select_type |       table        |  type  | possible_keys |   key   | key_len |                  ref                  | rows |    Extra    |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
|  1 | SIMPLE      | debiteuren_toegang | ALL    | NULL          | NULL    | NULL    | NULL                                  | 3008 | Using where |  |
|  1 | SIMPLE      | debiteuren         | eq_ref | PRIMARY       | PRIMARY | 4       | deb12311_1.debiteuren_toegang.bedrijf |    1 | Using where |  |
|  1 | SIMPLE      | contactpersonen    | ALL    | NULL          | NULL    | NULL    | NULL                                  | 4098 |             |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+

最佳答案

尝试这个,

   `选择
    contactpersonen.id,
    contactpersonen.voornaam,
    contactpersonen.achternaam,
    debiteuren.bedrijfsnaam,
    debiteuren.id为投标

    借方
        左联接
    contactpersonen ON contactpersonen.bedrijf = debiteuren.id
        左联接
    debiteuren_toegang ON debiteuren_toegang.bedrijf = debiteuren.id
哪里
 debiteuren_toegang.website ='web1'
        和
   instr(concat(contactpersonen.voornaam,contactpersonen.achternaam,debiteuren.id,debiteuren.bedrijfsnaam,contactpersonen.id),'henk'
        )> 0

极限10`

关于mysql - 搜索查询很慢怎么优化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21159394/

10-08 23:52