Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодирование текста в число 
:(
    Опции темы
begin
Дата 20.1.2016, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Есть php-скрипт, который добавляет в mysql-базу по несколько тысяч товаров из csv-файла.
При добавлении он должен проверить товар на уникальность по трем текстовым столбцам в базе (бренд и т.д.)
Тестирование показало, что этот этап занимает больше всего времени при загрузке файла (до 2 минут при 10 тыс товаров в файле). Включение составного индекса ничего не дало.
Появилась такая идея: mysql по числовым столбцам будет искать ведь намного быстрее, чем по текстовым. Что если эти текстовые поля хранить в виде чисел в трех числовых столбцах, или даже объединить в одно составное число и искать по одному числовому столбцу. Но для этого нужно придумать или подобрать алгоритм кодирования букв цифрами.
Суммарное количество букв в этих трех столбцах может доходить до 40. И если кодировать одну букву двумя цифрами (ведь букв в алфавите больше 10), то получится 40-значное число. Но даже тип BIGINT вместит только 19 знаков.

Существует ли кодирование текста в число, при котором можно закодировать 40 букв в тип INT?
PM MAIL   Вверх
Envy
Дата 20.1.2016, 14:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А что если брать md5 хеш от индексируемых полей и хранить его в БД как BINARY(16)?
Возможны коллизии, конечно, но это можно предусмотреть в коде.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
ksnk
Дата 20.1.2016, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(begin @  20.1.2016,  02:05 Найти цитируемый пост)
Включение составного индекса ничего не дало.

Точно? Может что-то неправильно было сделано? 
Обычно, для отладки запросов используется функция EXPLAIN, она выводит все используемые запросом ключи. Обычно, даже если просто проиндексировать все поля, которые используются в where, уже, как правило, получается прирост в скорости.

Цитата(begin @  20.1.2016,  02:05 Найти цитируемый пост)
Существует ли кодирование текста в число, при котором можно закодировать 40 букв в тип INT? 

crc32 от строковой конкатенации всех 3 полей. Или любую другую cache-функцию. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
igorold
Дата 21.1.2016, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



ksnk, просто конкатенация может привести к ошибке.

например сделай конкатенацию 121 и 30, а если попадется 12 и 130 - результат конкатенации один, а индексы все же разные.

аналогично про твое предложение md5(a+b+c)

А вообще, при применении индексов, должна увеличиться скорость ... ну, неплохо бы посмотреть на результат выполнения EXPLAIN ...

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Envy
Дата 21.1.2016, 12:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Конкатенация можеть дать одинаковый результат, да. И коллизия хеша тоже может случиться. Но, как я написал в первом посте, после выборки по хешу можно дополнительно проверить значения полей.

Вообще, конечно, было бы хорошо посмотреть на схему БД и на запросы к ней, которые использует автор. Можно тут - SQL Fiddle

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1084 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.