Adatbázis optimalizálása
Azok akik elég nagy táblákkal dolgoznak, sokszor megesik, hogy optimalizálniuk kell az adatbázisukat. Erre most mutatok egy nagyon egyszerű lehetőséget, melyet akár a programba is ágyazhatunk, és magától futhat cron segítségével. vagy egy kézzel készített poor-man-cron megoldással:
function optimize_database($DATABASE_LINK)
{
$result = mysql_query('SHOW TABLES',$DATABASE_LINK)
or die('Cannot get tables');
while($table = mysql_fetch_row($result)) {
mysql_query('OPTIMIZE TABLE '.$table[0],$DATABASE_LINK)
or die('Cannot optimize '.$table[0]);
}
}
Értelmi szerzője: David Walsh
Keresés egy MySQL-ben tárolt serializált adathalmaz részére
Legelső bejegyzésem arról szól, hogy az adataink serializálva találhatók az adatbázisba, akkor előfordulhat olyan eset, hogy a serializált adat részére vagyunk csak kíváncsiak. Hogy egyszerűbb legyen megérteni mire is gondolok, egy példával szemléltetem az esetet.
Adott egy webshop, ahol a rendelések rögzítésénél tárolni kell számlázási nevet és címet, valamint a szállítási nevet és címet. Hiszen lehet olyan eset, ahol a számlafizető az cégnév teljesen más, mint az a cím ami fel van tüntetve az üzletben, mellyel megtalálják. (pl xyz Bt. de az általa üzemeltetett volt neve a "Legtökéletesebb bolt". Továbbá a bejegyzett székhely lehet egy inkubátorházban, de az üzlethelyiség egy plázában.
Így az adatok logikailag össze függnek, s megérthető hogy valaki serializálta őket. Tehát tárolva van számlanév;számlacím és szállítnév;szállítcím egy-egy mezőben.
Viszont később felmerül egy olyan kérés, hogy visszamenőleg szeretnének rákeresni hogy pl.: lajos névre számláztak-e vagy szállítottak-e. Az egész mezőben így nem lehet keresni, mert akkor eredményként kapnánk Nagy Lajos Király útját is, feltéve ha van ilyen címünk az adatbázisban. Mit lehet ilyenkor tenni?
A probléma megoldásához bújtam a MySQL dokumentációt, amíg rá nem találtam a SUBSTRING_INDEX(mit_bontson_szet, mivel, melyik_kell). Első paramétere, lehet egy string, vagy egy adatbázis mező. Második paraméter a szeparáló karakter, a harmadik paraméter egy index szám, hogy a feldarabolt string hányadik részét kérjük vissza. Viszont arra figyelni kell, hogy 1-től indul az indexelés!
Példa:
Adatbázisunk `orders` táblájának `billing` mezőjének tartalma 'név;cím' akkor ezeket kapjuk:
SELECT SUBSTRING_INDEX(`billing`, ';', 1) AS billing FROM `orders` WHERE 1 SELECT `id` FROM `orders` WHERE SUBSTRING_INDEX(`billing`, ';', 1) LIKE '%lajos%'
Az első esetben az eredmény név, a másodikban az azonosító