Полагаю, вам нужен только ПОЛНЫЙ ТЕКСТ.
Если это вас не устраивает, у вас есть только один шанс решить эту проблему: кэшировать результаты.
Таким образом, вам не придется анализировать 3bil записей для каждого запроса
В любом случае вот как вы можете это сделать:
$result = array();
$sql = "SELECT * FROM TABLE";
while( $row = ... ) {
$result[] = $row; //> Append the current record
}
Теперь результаты содержат все строки из вашей таблицы.
В этот момент вы сказали, что хотите similar_text()
все столбцы друг с другом.
Для этого и кеширования результатов вам понадобится хотя бы таблица (как я уже говорил в комментарии).
//> Starting calculating the similarity
foreach($result as $k=>$v) {
foreach($result as $k2=>$v2) {
//> At this point you have 2 rows, $v and $v2 containing your column
$similarity = 0;
$similartiy += levensthein($v['column1'],$v2['column1']);
$similartiy += levensthein($v['column2'],$v2['column2']);
//> What ever comparison you need here between columns
//> Now you can finally store the result by inserting in a table the $similarity
"INSERT DELAYED INTO similarity (value) VALUES ('$similarity')";
}
}
2 Вещи, на которые вы должны обратить внимание:
Я использовал levensthein , потому что он намного быстрее, чем Similar_text (обратите внимание, что это значение противоположно Similar_text, потому что чем больше значение, которое возвращает levensthein, тем меньше сходство между строками)
Я использовал INSERT DELAYED , чтобы значительно снизить стоимость базы данных