我有一个搜索查询,它使用一些连接来搜索不同的相关表。但最近我向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 | | |
+----+-------------+--------------------+--------+---------------+---------+---------+---------------------------------------+------+-------------+--+
答案 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`