Партишънинг по град смятам, че ще се справи. Да разбие фирмите по градове. Телефоните също могат да се разделят по код на населеното място. Е вярно, че София ще има най-много фирми, но няма да са 1кк
. Каква е базата mysql/maria или postgres? Ако си на mysql то таблиците е хубаво да са майисам, че инодб е бавничко.
Това добре трябва да се помисли. Най-малкото разделянето на дялове е възможно само с InnoDB тип. InnoDB е бавно при insert/update. Селекта не е чак толкова бавен, че да се лишаваме от благините, които предлага. Най-вече заради заключването на таблицата при INSERT/UPDATE. При InnoDB това е на ниво запис (row), докато при MyISAM се заключва цалата таблица и другите чакат на опашка докато приключи заявката. INSERT/UPDATE LOW_PRIORITY ще изпълни с приоритет SELECT-a в този случай.
Според мен.
- опитай се да прецизираш полетата в таблицата с данните. При много на брой записи всеки килобайт е важен
- сортирнае по double, rand() ако може да се избягва. Първото може да го представиш като число без знак умножено по 100 примерно (преди да го запишешв базата)
- за кеширането писаха хората
- обноване на запис - само при нужда, импорт, крон задачи етц - по-добре направи няколко селекта в повече за да проверих дали има промяна от колкото да направиш обновяване без нужда.
- ако имаш статистика на прегледи - извади я от основната таблица. Или намери някакъв варинат да не се локват таблиците докато правиш ъпдейта. може някакъв масив в споделена памет, който на определено време да обновява данните. Въпросът е да се намалат insert/update заявките.
- внимавай със сеченията (JOIN). Удобное да джойнеш примерно таблицата с градове, категории, дейности и записите но това вътрешно за СУБД е разносилно на временна таблица с брой редове равна на произведението от броя редове на всички таблици участващи в заявката. Категориите и градовете рядко се променят, така че за тях кеша е 100% оправдан. След това програмно си ги "мапваш" към променливите за град, категория етц.
- ако имаш големи таблици, които не са пряко свързани с проекта - разкарай ги. Заемат само памет. Индекситена таблиците (би трябвало) да са в паметта.
- добре помисли, кое трябва да е индекс и кое не. В някои случаи повече индекси забавят работата. Естествено и обратното е вярно. Когхато имаш големи индексни таблици търсенето в тях е бавно.
Ами сигурно мога да напиша още много неща, но толкова време имам. Стъпка по-стъпка ще го оправиш. Естествено провери данеби забаването да идва от скипта. Сложи си точни на които да имериш времето, примерно преди заявката, след заявката, след като се изведат данните. Сравни времената и ще намериш слабото мяасто. Принципно ваденето от базата би трябвало да е най-бавната операция. Ако времето за обработка в скрипта е съизмеримо с това от базата - има проблем и със самият скрипт.
Ако ползваш някакъв ORM, QueryBuilder или тем подобна простотия виж далии RAW заявки нама да са по-удачни.
Поздрави.