Přečtěte si:Omezení MySQL Partitioning
1.) FK nejsou podporovány na dělených tabulkách.
- Jednou možností je vytvořit uloženou proceduru, která vloží/aktualizuje záznam, a ověřit uvnitř procedury, že předané ID uživatele je přítomno ve vaší tabulce uživatelů, než dojde k vložení. Oprávnění v tabulce byste měli nastavit tak, aby aktualizace a vkládání bylo povoleno pouze poskytovateli služeb, aby aplikace a/nebo uživatelé mohli zablokovat kontrolu. Budete také muset přijmout opatření při odebírání uživatelů z tabulky uživatelů.
2.) Který sloupec použijete pro rozdělení, bude záviset na tom, jak k tabulce přistupujete. Pokud jsou vaše dotazy vždy založeny na čísle vozidla, pak má pravděpodobně smysl vytvořit hashovací oddíl v tomto sloupci. Pokud se ptáte nebo hlásíte více na něco jako „jaká vozidla byla přidána tento měsíc“ nebo chcete „rozbalit“ oddíly, jakmile dosáhnou určitého věku, pak může být správnou cestou rozdělení podle data. To je něco, o čem se budete muset rozhodnout na základě vašeho použití.
3.) Více informací naleznete na výše uvedeném odkazu.
Upravit na základě dotazu uživatele:
Vkládání záznamu každé 3 sekundy není příliš výkonné. Ujistěte se, že máte v tabulce uživatelů primární klíč, aby kontrola uvnitř procedury mohla být provedena efektivně. (To platí i v případě, že by byly podporovány FK) DB by za vás tuto kontrolu prováděla v zákulisí, pokud byste měli podporu pro FK, takže v tomto smyslu vám to neubližuje. Pokud kontrola skončí jako úzké hrdlo, možná budete cítit potřebu ji zrušit a případně nahlásit chybná ID uživatelů jako noční dávkový proces, ale pokud je vaše tabulka uživatelů relativně malá a správně indexovaná, nevidím to jako problém.
Další možností by bylo provést rozdělení ručně (tj. shardovat) s rozdělenými nebo nerozdělenými tabulkami. S nerozdělenými tabulkami samozřejmě můžete použít nativní cizí klíče. Například byste rozdělili svou tabulku vozidel do několika tabulek jako:(za předpokladu, že chcete jako "klíč" použít vehicleNo)
VozidlaNosLessNež1000
VozidlaNosLessThan2000
VehiclesNosLessThan...
VozidlaNosLessThanMAX
Zde asi chcete mít opět SP, aby aplikace/uživatel o tabulkách nemusel vědět. Poskytovatel služeb by byl odpovědný za vložení/aktualizaci správné tabulky na základě zadaného čísla vozidla. Také byste chtěli SP pro výběr dat, aby aplikace/uživatel nemusel znát tabulku, ze které by mohl vybírat. Pro snadný přístup ke všem datům můžete vytvořit pohled, který spojí všechny tabulky dohromady.
Všimněte si, že jednou z výhod toho je, že v současné době MyISAM zamyká během aktualizací celou rozdělenou tabulku, nejen oblast, kterou aktualizuje. Sdílení tabulky tímto způsobem zmírňuje tento spor, protože tabulky samotné jsou "oddíly".
Na základě omezených dat, která mám o tom, co děláte, bych pravděpodobně napsal 2 uložené procedury, 1 pro výběr dat a 1 pro aktualizaci/vkládání dat a nechal bych je vaše aplikace používat pro veškerý přístup. Pak bych nejprve zkusil pravidelné rozdělení pomocí hash na vehicleNo a zároveň bych v rámci postupu vynutil klíč user_id. Pokud se to stane problémem, můžete snadno přejít na sdílení dat mezi více tabulkami, aniž byste museli měnit aplikaci, protože veškerá logika, jak načíst a aktualizovat data, je obsažena v SP.