INSERT DELAYED
Školení, která pořádám
MySQL obsahuje rozšíření příkazu INSERT v podobě modifikátoru DELAYED. Ten způsobí, že data do tabulky nejsou uložena hned, ale až v momentě, kdy nebudou blokovat žádný SELECT. Vzhledem k tomu, že INSERT u MyISAM tabulek blokuje SELECT pouze v případě, kdy jsou uvnitř dat prázdné bloky po smazaných záznamech, je podle mě vhodné INSERT DELAYED využít pouze za těchto podmínek:
- V tabulce bývají prázdné bloky po smazaných záznamech.
- Získání starých dat je prioritnější než uložení nových.
- Při získávání dat nepotřebujeme vrátit nová data, která se ještě nestihla uložit.
- Po vložení dat nepotřebujeme znát insert_id ani počet skutečně uložených řádek.
Vzhledem k tomu, že používání INSERT DELAYED znamená obhospodařování vlastního vlákna pro každou tabulku, která tuto funkci používá, a tím i vyšší režii (prý až o 30 %), je lepší se v ostatních případech tomuto rozšíření vyhnout.
Přijďte si o tomto tématu popovídat na školení Konfigurace a výkonnost MySQL.
Diskuse
Vojtěch Semecký:
Souhlasím s tím, že je lepší se tomuto rozšíření vyhnout. Experimentoval jsem s ním dlouho. Dále jsem experimentoval s obdobným rozšířením UPDATE LOW_PRIORITY a ani jedno se mi neosvědčilo. Testoval jsem to v praxi na všech svých webech (SrovnaniCen.cz, Kinomol.cz, Kratce.cz, FreshFolder.com) a všude se výkon DB spíše zhoršil.
O té vyšší režii jsem nevědel, ale setkal jsem se s jiným problémem. On totiž ten čekající INSERT během čekání blokuje jeden MySQL proces. A pokud máte hodně vytížený server, tak se často stane, že tam delší dobu trčí nevyřízené INSERTY, když na ně přijde řada, tak to pak zasekne tolik SELECTů, že se kompletně vyčerpají MySQL procesy.
Zkrátka výkon tím spíš klesne a jen si zaděláte na problémy se zahlcováním MySQL.
Martiner:
Nejlepší je, vyhnout se MyISAM...
Vojtěch Semecký:
Proč? MyISAM je sice jednoduchý a chybí mu spousta vlastností, které jiné DB enginy mají, ale pokud je nepotřebujete, je zase velmi rychlý. Pro velkou část webových aplikací je MyISAM nejlepší volba.
Petr:
No jo, ale v InnoDB nemůžu udělat index nad polem typu 'text'. Takže pokud tam něco hledám (třeba pomocí LIKE) tak je to bez indexu na strašně dlouho :-(
A třeba zrovna aplikace typu shop je bez možnosti hledání v textu celkem k ničemu...
Index pomůže pouze v případě, že se hledá od začátku textu. Pokud se hledá kdekoliv uvnitř textu pomocí '%$search%' (typický případ), tak je index k ničemu.
Diskuse je zrušena z důvodu spamu.