Я хочу сделать своего рода черный список, поэтому я храню в своей базе данных
id|value
-----------
1|test.com
2|example@
3|@another.
...
Теперь я ищу самый быстрый способ проверить, соответствует ли данная строка (например, адрес электронной почты) части значений из БД.
Например
my@mail.com -> нет результатов в БД -> нет спама
example@mail.com -> совпало с ID2 -> спам
…
Есть ли способ сделать это, инсайдер, оператор MySQL?
На данный момент я вижу только способ загрузить все значения в массиве, проверьте это, но этот способ требует много ресурсов, и это действительно медленно.
Большое спасибо.
Используйте Query следующим образом:
SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';
Полная обработка возможна только в MySQL.
Обратите внимание, это будет не масштабировать на больших таблицах, потому что индексация невозможна, так что имейте это в виду.
запрос
SELECT
*
FROM (
SELECT
'test' COLLATE 'utf8mb4_general_ci' AS word
UNION ALL
SELECT
'example' COLLATE 'utf8mb4_general_ci' AS word
# When you need more words
# UNION AL
# SELECT 'another' COLLATE 'utf8mb4_general_ci' AS word
#
) AS check_list
INNER JOIN
blacklist
ON
blacklist.`value` LIKE CONCAT('%', check_list.word ,'%')
# note COLLATE 'utf8mb4_general_ci' might not even be needed to the used server
# because it's depending on server config and used table charsets/collates
Результаты
| word | id | value |
| ------- | --- | -------- |
| test | 1 | test.com |
| example | 2 | example@ |
Или для более оптимальной версии, которая масштабируется на больших таблицах, вы должны использовать индексацию FULLTEXT и MATCH()
запрос
SELECT
*
FROM
blacklist
WHERE
MATCH (blacklist.`value`)
AGAINST (
(
'test example'
)
IN BOOLEAN MODE
)
Увидеть демонстрация
Разве это не просто проверка с LOCATE()
чтобы увидеть, находится ли строка внутри заданного адреса электронной почты в виде строки?
SELECT
COUNT(*)
FROM
blacklist
WHERE
LOCATE(value, 'my@mail.com');
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
SELECT
COUNT(*)
FROM
blacklist
WHERE
LOCATE(value, 'example@mail.com');
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
Увидеть DB Fiddle demo.