我有一个搜索查询,该查询使用一些联接在不同的关联表中进行搜索。但是最近我在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/