![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
begin |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 415 Регистрация: 16.5.2007 Репутация: нет Всего: нет |
Есть php-скрипт, который добавляет в mysql-базу по несколько тысяч товаров из csv-файла.
При добавлении он должен проверить товар на уникальность по трем текстовым столбцам в базе (бренд и т.д.) Тестирование показало, что этот этап занимает больше всего времени при загрузке файла (до 2 минут при 10 тыс товаров в файле). Включение составного индекса ничего не дало. Появилась такая идея: mysql по числовым столбцам будет искать ведь намного быстрее, чем по текстовым. Что если эти текстовые поля хранить в виде чисел в трех числовых столбцах, или даже объединить в одно составное число и искать по одному числовому столбцу. Но для этого нужно придумать или подобрать алгоритм кодирования букв цифрами. Суммарное количество букв в этих трех столбцах может доходить до 40. И если кодировать одну букву двумя цифрами (ведь букв в алфавите больше 10), то получится 40-значное число. Но даже тип BIGINT вместит только 19 знаков. Существует ли кодирование текста в число, при котором можно закодировать 40 букв в тип INT? |
|||
|
||||
Envy |
|
|||
Unregistered |
А что если брать md5 хеш от индексируемых полей и хранить его в БД как BINARY(16)?
Возможны коллизии, конечно, но это можно предусмотреть в коде. Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Точно? Может что-то неправильно было сделано? Обычно, для отладки запросов используется функция EXPLAIN, она выводит все используемые запросом ключи. Обычно, даже если просто проиндексировать все поля, которые используются в where, уже, как правило, получается прирост в скорости.
crc32 от строковой конкатенации всех 3 полей. Или любую другую cache-функцию. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: нет Всего: 17 |
ksnk, просто конкатенация может привести к ошибке.
например сделай конкатенацию 121 и 30, а если попадется 12 и 130 - результат конкатенации один, а индексы все же разные. аналогично про твое предложение md5(a+b+c) А вообще, при применении индексов, должна увеличиться скорость ... ну, неплохо бы посмотреть на результат выполнения EXPLAIN ... Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Envy |
|
|||
Unregistered |
Конкатенация можеть дать одинаковый результат, да. И коллизия хеша тоже может случиться. Но, как я написал в первом посте, после выборки по хешу можно дополнительно проверить значения полей.
Вообще, конечно, было бы хорошо посмотреть на схему БД и на запросы к ней, которые использует автор. Можно тут - SQL Fiddle Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |