| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Кодирование текста в число |
| Автор: begin 20.1.2016, 02:05 |
| Есть php-скрипт, который добавляет в mysql-базу по несколько тысяч товаров из csv-файла. При добавлении он должен проверить товар на уникальность по трем текстовым столбцам в базе (бренд и т.д.) Тестирование показало, что этот этап занимает больше всего времени при загрузке файла (до 2 минут при 10 тыс товаров в файле). Включение составного индекса ничего не дало. Появилась такая идея: mysql по числовым столбцам будет искать ведь намного быстрее, чем по текстовым. Что если эти текстовые поля хранить в виде чисел в трех числовых столбцах, или даже объединить в одно составное число и искать по одному числовому столбцу. Но для этого нужно придумать или подобрать алгоритм кодирования букв цифрами. Суммарное количество букв в этих трех столбцах может доходить до 40. И если кодировать одну букву двумя цифрами (ведь букв в алфавите больше 10), то получится 40-значное число. Но даже тип BIGINT вместит только 19 знаков. Существует ли кодирование текста в число, при котором можно закодировать 40 букв в тип INT? |
| Автор: Envy 20.1.2016, 14:59 |
| А что если брать md5 хеш от индексируемых полей и хранить его в БД как BINARY(16)? Возможны коллизии, конечно, но это можно предусмотреть в коде. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kodirovaniye-teksta-v-chislo-id569ec15dae2015822e8b4567#findElement_E7045_569f768bae2015db2c5f54b7_0 |
| Автор: igorold 21.1.2016, 06:29 |
| ksnk, просто конкатенация может привести к ошибке. например сделай конкатенацию 121 и 30, а если попадется 12 и 130 - результат конкатенации один, а индексы все же разные. аналогично про твое предложение md5(a+b+c) А вообще, при применении индексов, должна увеличиться скорость ... ну, неплохо бы посмотреть на результат выполнения EXPLAIN ... Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kodirovaniye-teksta-v-chislo-id569ec15dae2015822e8b4567#findElement_E7045_56a05089ae20159b345f51f0_0 |
| Автор: Envy 21.1.2016, 12:46 |
| Конкатенация можеть дать одинаковый результат, да. И коллизия хеша тоже может случиться. Но, как я написал в первом посте, после выборки по хешу можно дополнительно проверить значения полей. Вообще, конечно, было бы хорошо посмотреть на схему БД и на запросы к ней, которые использует автор. Можно тут - http://sqlfiddle.com/ Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kodirovaniye-teksta-v-chislo-id569ec15dae2015822e8b4567#findElement_E7045_56a0a90aae201580425f52fa_0 |