Най-добрият начин за работа с MySQL дата за ефективност с хиляди потребители

В момента съм част от екип, който проектира сайт, който потенциално ще има хиляди потребители, които ще извършват редица търсения, свързани с дати. По време на фазата на проектиране се опитвахме да определим кое има повече смисъл за оптимизиране на производителността.

Трябва ли да съхраняваме полето datetime като mysql datetime. Или трябва да го разделите на няколко полета (година, месец, ден, час, минута, ...)

Въпросът е с голям набор от данни и потенциално голям набор от потребители, бихме ли спечелили производителност мъдро, като разбием datetime на множество полета и спестяваме разчитането на функции за дата на mysql? Или mysql вече е оптимизиран за това?


person bitLost    schedule 24.05.2010    source източник


Отговори (3)


Разгледайте функциите за дата и час на MySQL документация, защото можете да изтеглите конкретна информация от дата, като използвате съществуващи функции като ГОДИНА, MONTH и т.н. Но докато те съществуват, ако имате индекс в колоната(ите) с дата, използването на тези функции означава, че тези индекси не могат да се използват...

Проблемът със съхраняването на дата като отделни компоненти е работата, необходима за реконструирането им в дата, когато искате да направите сравнения на диапазони или операции с дати.

В крайна сметка изберете какво работи най-добре с вашето приложение. Ако рядко има нужда датата да бъде разделена, обмислете използването на VIEW, за да изложите компонентите на датата, без да записвате евентуално излишна информация във вашите таблици.

person OMG Ponies    schedule 24.05.2010

Използвайте обикновено поле за дата и час. Винаги можете да преминете към отделните компоненти надолу по линията, ако производителността стане проблем. Опитайте се да избегнете преждевременната оптимизация - в много случаи YAGNI. Може да се окаже, че използвате както полето за дата и час, така и методологията на отделен компонент, тъй като и двете имат своите силни страни.

person James Jones    schedule 24.05.2010

Ако знаете предварително някои ключови критерии, които ще имат всички търсения, MySQL (>= v5.1) разделяне на таблици може да помогне.

Например, ако имате таблица като тази:

create table Books(pubDate dateTime, title varchar(50));

И знаете, че всички търсения трябва да включват поне една година, можете да я разделите в полето за дата по следния ред:

create table Books(pubDate dateTime,title varchar(50)  
partition by hash(year(pubDate)) partitions 10;

След това, когато стартирате select срещу таблицата, ако вашата клауза where включва критерии, които ограничават дяла, върху който могат да съществуват резултатите, търсенето ще сканира само този дял, а не пълно сканиране на таблица. Можете да видите това в действие с:

-- scans entire table
explain partitions select * from Books where title='%title%';

срещу нещо като:

-- scans just one partition
explain partitions select * from Books 
where year(pubDate)=2010
and title='%title%'; 

MySQL документацията за това е доста добра и можете да избирате от множество алгоритми за разделяне.

Дори ако решите да разделите датата, дял на таблица, да речем, година (int) (ако приемем, че търсенията винаги ще посочват година) може да помогне.

person Jeffrey Knight    schedule 24.05.2010