sobota, 27 listopada 2010

Sprawdzanie struktury tabeli oraz kluczy głównych i obcych MySql, tworzennie index'ów

Często zdarza się, że strony wczytują się nad wyraz wolno.
Serwer na, którym jest umieszczona baza danych nie jest mocno obciążony (ani CPU ani pamięć), ale i tak strony wczytują się przez wieczność.
W takim przypadku możemy zainwestować w jeszcze mocniejszą maszynę z szybszymi dyskami twardymi, bez gwarancji, że to rozwiąże nasz problem lub zabrać się za optymalizację baz danych.

Zaczynamy od połączenia się z bazą danych:
mysql -u root -p

Po połączeniu sprawdzamy jakie bazy danych są dostępne:
show databases;


Wybieramy jedną z nich:
use nazwa_bazy;


Sprawdzamy jakie są w niej utworzone tabele:
show tables ;

Sprawdzamy jaka jest struktura tabeli:
describe nazwa_tabeli ;
mysql> describe role ;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| rid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | UNI | | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0,00 sec)


Sprawdzamy jakie są klucze główne, klucze obce i index'y:
show index from nazwa_tabeli;
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| system | 0 | PRIMARY | 1 | filename | A | 50 | NULL | NULL | | BTREE | |
| system | 1 | modules | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | modules | 2 | status | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | modules | 3 | weight | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | modules | 4 | filename | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | bootstrap | 2 | status | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 3 | bootstrap | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 4 | weight | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 5 | filename | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | type_name | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | type_name | 2 | name | A | NULL | NULL | NULL | | BTREE | |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
12 rows in set (0,00 sec)

Teraz możemy przystąpić do analizy jakie zapytania generują największe obciążenie i stworzyć index na wybranych kolumnach w tabeli.
Index może składać się z jednej kolumny lub wielu kolumn.

Tworzymy przykładowy index:
create index nazwa_index'u on nazwa_tabeli (nazwa_kolumny);

sobota, 20 listopada 2010

Jak usunąć z banera "jeszcze jeden blog wordpress"

Poniżej przedstawiam wersję hardcore, ponieważ łatwej opcji usuwania tego opisu nie udało mi się znaleźć (z wszelkiego rodzaju CMS'ami jestem trochę na bakier).

Pierwszą czynnością którą wykonałem było wykonanie zrzutu (przez niektórych nazywanego eksportem) bazy danych z WordPress'em do pliku, w celu sprawdzenia gdzie znajduje się wpis "Jeszcze jeden blog WordPress".

Udało mi się odnaleźć wpis:
LOCK TABLES `wp_options` WRITE;
/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */;
INSERT INTO `wp_options` VALUES (1,0,'_transient_random_seed','f47233eb1b9cc4921b1748acbd120bd6','yes'),(2,0,'siteurl','http://klejnotyart.pl','yes'),(3,0,'blogname','klejnotyart.pl','yes'),(4,0,'blogdescription','Jeszcze jeden blog WordPress','yes'),(5,0,'users_can_register','0','yes')

Połączyłem się więc z moją bazą danych:
mysql -u root -p
wpisałem hasło i zatwierdziłem enterem.

Jeżeli baza danych znajduje się na zdalnym serwerze należy dodać jeszcze parametr -h i wpisać adres serwera.

Następnie wyświetliłem dostępne bazy danych:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| drupal |
| joomla |
| mysql |
| portal |
| wordpress |
+--------------------+
6 rows in set (0,00 sec)


Dane dotyczące wordpressa znajdują się oczywiście w bazie zatytułowanej wordpress więc się z nią połączyłem:
mysql> use wordpress ;
Database changed

Kolejnym krokiem było sprawdzenie tabel w bazie danych wordpress oraz sprawdzenie struktury tych tabel:


mysql> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
10 rows in set (0,00 sec)

mysql> describe wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| option_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| blog_id | int(11) | NO | PRI | 0 | |
| option_name | varchar(64) | NO | PRI | | |
| option_value | longtext | NO | | NULL | |
| autoload | varchar(20) | NO | | yes | |
+--------------+---------------------+------+-----+---------+----------------+
5 rows in set (0,00 sec)


Wiedziałem ze zrzutu bazy, że interesujące mnie dane są umieszczone w tabeli wp_options.

Pozostało tylko wykonać zapytanie, które wyświetli wpis "jeszcze jeden blog wordpress":
mysql> select * from wp_options where option_id=4;
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Alternatywną metodą wykonania tego zapytania jest:
mysql> select * from wp_options where option_value="Jeszcze jeden blog WordPress";
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Co jest dość interesujące można zmienić wielkość liter w zwrocie "Jeszcze ..." i dalej zostanie ono wykonane poprawnie:
mysql> select * from wp_options where option_value="jeszcze jeden blog wordpress";
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Ostatnim etapem jest zmiana wartości kolumny option_value dla wpisu, którego option_id jest równe 4:
mysql> update wp_options set option_value="" where option_id=4;
Query OK, 1 row affected (0,00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Pozostaje wejść teraz na stronę ponowie i okaże się, że wpis "Jeszcze jeden blog WordPress" zniknął.

W celu dodatkowego potwierdzenia można też wykonać zapytanie:

mysql> select * from wp_options where option_id=4 ;
+-----------+---------+-----------------+--------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+--------------+----------+
| 4 | 0 | blogdescription | | yes |
+-----------+---------+-----------------+--------------+----------+
1 row in set (0,00 sec)


Oczywiście w większości przypadków nie chcemy całkowicie usuwać tego wpisu, tylko zmienić jego zawartość np.:
mysql> update wp_options set option_value="blog ninja" where option_id=4 ;
Query OK, 1 row affected (0,00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

W ten "prosty" sposób staliśmy się właśnie szczęśliwymi posiadaczami blogu o ninja :) .

Podejrzewam, że istnieje możliwość wyklikania tej zmiany ale jeżeli w ciągu kilku minut nie mogę znaleźć tej opcji w panelu administracyjnym, ani google nie podaje mi gotowych rozwiązań to wole to zrobić ręcznie i się czegoś przy okazji nauczyć.

niedziela, 14 listopada 2010

Linux jest wszędzie

Na pewno zdarzyło się Wam rozmawiać ze znajomymi i napomknąć o Linux'ie, w odpowiedzi prawdopodobnie usłyszeliście "ale co Ty marudzisz o tym Linux'ie i tak nikt z tego nie korzysta".

Oczywiście w takiej sytuacji można zrobić wywód: większość stron internetowych działa na serwerach Linux'owych lub Unix'owych, większość urządzeń sieciowych działa w oparciu o jakąś wersję tychże systemów.

No i wreszcie najważniejsze, zawsze możecie wskazać na mojego bloga i powiedzieć:
Linux jest nawet na przystankach w Gdańsku :]



Więc następnym razem gdy będziecie w Gdańsku i zadrzecie głowy do góry na przystanku ...
... to oczom waszym ukaże się rozkład elektroniczny działający na systemie operacyjnym Linux.