搜索查询很慢如何优化?

时间:2014-01-16 10:40:13

标签: mysql search indexing

我有一个搜索查询,它使用一些连接来搜索不同的相关表。但最近我向contactpersonen表添加了大约3000个联系人。它变得非常慢。

表格如下: debiteuren: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 |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+

PARTIAL QUERY EXPLAIN:

+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
| 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 |             |  |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+

1 个答案:

答案 0 :(得分:1)

试试这个,

   ` 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
 debiteuren_toegang.website = 'web1'
        AND
   instr ( concat(contactpersonen.voornaam, contactpersonen.achternaam, debiteuren.id, debiteuren.bedrijfsnaam,contactpersonen.id) , 'henk'
        )>0

LIMIT 10`