У меня есть коллекция записей среднего размера - около 20 миллионов, - которую мне нужно загрузить в mySQL для использования в анализе данных. Это записи людей, посещающих места. Они однозначно идентифицируются тремя элементами данных:
- место - уникальный INT
- персона - символьная строка, иногда числовая, а иногда буквенно-цифровая, например, AB12345678
- визит - похож на человека
Я не имею никакого контроля над человеком и содержимым поля посещения, так как оно предоставляется разными местами, и каждое место делает свое дело.
Я могу найти все записи о человеке, сопоставив и место и человека, и индивидуальную запись, сопоставив все три.
Я могу сделать это нормально в mySql, создав такую таблицу:
CREATE TABLE ENCOUNTER (
PLACE int(11) NOT NULL,
PERSON varchar(255) NOT NULL,
VISIT varchar(255) NOT NULL,
ARRIVAL_TIME datetime DEFAULT NULL,
DEPARTURE_TIME datetime DEFAULT NULL,
EVENT varchar(255) NOT NULL,
PRIMARY KEY (PLACE,PERSON,VISIT)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
Я пошел с MyISAM, потому что мне не нужна ACID целостность транзакций для этой таблицы; он используется для статистической отчетности, поэтому, если он устарел на одну или две строки, это не проблема.
В таблицу часто попадают UPDATE, которые просто меняют одно из полей, например DEPARTURE_TIME. Эти ОБНОВЛЕНИЯ, скорее всего, будут примерно в два раза чаще, чем ВСТАВКИ новых строк. Нет необходимости обновлять идентификаторы места, человека или посещения.
Вот несколько вопросов:
Будет ли мне лучше работать с одним индексом и ключевым столбцом, объединяющим информацию о месте / человеке / посещении?
Какую долю попадания я получу для индексов varchar? Стоит ли пытаться ограничить их полем фиксированной длины?
Какие-нибудь еще советы из собранной мудрости?
Спасибо.