<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; mysql</title>
	<atom:link href="https://blog.visionsoftware.pl/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>Numerowanie wierszy w MySQL</title>
		<link>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html</link>
		<comments>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html#comments</comments>
		<pubDate>Sat, 30 Jun 2012 20:17:28 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[numerowanie wierszy]]></category>
		<category><![CDATA[raport]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=610</guid>
		<description><![CDATA[Tworząc raport zawierający określoną liczbę wierszy, dobrym pomysłem jest ich ponumerowanie. Stosując prostą sztuczkę możemy to zrobić bezpośrednio w MySQL, pomijając dodatkową obróbkę danych w edytorze tekstowym lub arkuszu kalkulacyjnym. Wystarczy w tym celu skorzystać ze zmiennych. Rozwiązanie problemu numerowania wierszy w MySQL jest niezwykle proste. Wystarczy zdefiniować zmienną globalną, która będzie przechowywać licznik i wyświetlić ją jako argument polecenia SELECT. Może to wyglądać w następujący sposób: Niestety, sytuacja zaczyna się komplikować, gdy rozbudujemy zapytanie. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Tworząc raport zawierający określoną liczbę wierszy, dobrym pomysłem jest ich ponumerowanie. Stosując prostą sztuczkę możemy to zrobić bezpośrednio w MySQL, pomijając dodatkową obróbkę danych w edytorze tekstowym lub arkuszu kalkulacyjnym. Wystarczy w tym celu skorzystać ze zmiennych. <span id="more-610"></span></p>
<p>Rozwiązanie problemu numerowania wierszy w MySQL jest niezwykle proste. Wystarczy zdefiniować zmienną globalną, która będzie przechowywać licznik i wyświetlić ją jako argument polecenia <code>SELECT</code>. Może to wyglądać w następujący sposób:</p>
<pre class="brush: sql; title: ; notranslate">
set @row = 0;
select @row := @row + 1 as &quot;Lp.&quot;,
imie,
nazwisko
from klienci
</pre>
<p>Niestety, sytuacja zaczyna się komplikować, gdy rozbudujemy zapytanie. Wzbogacając je o złączenia, klauzulę <code>WHERE</code> oraz sortowania, możemy spodziewać się błędnego numerowania wierszy. Widać to na poniższym przykładzie pobierania danych dotyczących statystyk odwiedzin strony www:</p>
<pre class="brush: sql; title: ; notranslate">
SET @a:=0;
SELECT @a:=@a+1 AS &quot;row&quot;,
IP
FROM `stats` st JOIN
`sources` so ON st.source_id = st.source_id
WHERE st.created_at BETWEEN &quot;2011-01-01 00:000:00&quot; AND &quot;2011-01-01 23:59:59&quot;
AND st.IP LIKE &quot;1%&quot;
AND st.source_id=1
ORDER BY st.IP
</pre>
<p>Wynik takiego wywołania będzie następujący:</p>
<pre>
row     IP
------  ---------------
77      100.113.10.222
50      100.113.10.222
23      100.113.10.222
60      104.87.121.89
33      104.87.121.89
6       104.87.121.89
[…]
</pre>
<p>Sposobem na rozwiązanie tego problemu będzie podzapytanie w klauzuli <code>FROM</code>. Wystarczy umieścić numerowanie wierszy w zewnętrznym zapytaniu i dodać do niego pozostałe interesujące nas kolumny, które będą pobierane z wewnętrznego zapytania, odpowiedzialnego za filtrowanie oraz sortowanie. Zapytanie SQL po modyfikacji może więc wyglądać w następujący sposób:</p>
<pre class="brush: sql; title: ; notranslate">
SET @a:=0;
SELECT @a:=@a+1, IP FROM (
SELECT st.IP
FROM `stats` st JOIN
`sources` so ON st.source_id = st.source_id
WHERE st.created_at BETWEEN &quot;2011-01-01 00:000:00&quot; AND &quot;2011-01-01 23:59:59&quot;
AND st.IP LIKE &quot;1%&quot;
AND st.source_id=1
ORDER BY st.IP
) AS sub
</pre>
<p>Numerowanie wierszy w wyniku powyższej modyfikacji będzie poprawne:</p>
<pre>
row     IP
------  ---------------
1       100.113.10.222
2       100.113.10.222
3       100.113.10.222
4       104.87.121.89
5       104.87.121.89
6       104.87.121.89
[...]
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/bazy-danych/numerowanie-wierszy-w-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: grupowanie i zliczanie według dat</title>
		<link>https://blog.visionsoftware.pl/bazy-danych/mysql-grupowanie-i-zliczanie-wedlug-dat.html</link>
		<comments>https://blog.visionsoftware.pl/bazy-danych/mysql-grupowanie-i-zliczanie-wedlug-dat.html#comments</comments>
		<pubDate>Mon, 30 Apr 2012 10:59:06 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[count]]></category>
		<category><![CDATA[daty]]></category>
		<category><![CDATA[group by]]></category>
		<category><![CDATA[grupowanie]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=574</guid>
		<description><![CDATA[Bardzo często podczas pobierania danych z bazy, zachodzi potrzeba budowania raportu z grupowaniem na okresy: dni, tygodnie, miesiące, itd. Niekiedy dochodzi do tego potrzeba podziału na wybrane grupy. W niniejszym tekście przedstawię kilka przykładowych sposobów na takie zapytania z użyciem dat w MySQL. Do poniższych przykładów będzie wykorzystana fikcyjna, uproszczona baza danych, zawierająca statystyki wejść na stronę www. Tabela stats zawiera dane na temat wejść i jest powiązana z tabelą sources zawierającą źródła wejść (bezpośrednie, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bardzo często podczas pobierania danych z bazy, zachodzi potrzeba budowania raportu z grupowaniem na okresy: dni, tygodnie, miesiące, itd. Niekiedy dochodzi do tego potrzeba podziału na wybrane grupy. W niniejszym tekście przedstawię kilka przykładowych sposobów na takie zapytania z użyciem dat w MySQL.<span id="more-574"></span></p>
<p>Do poniższych przykładów będzie wykorzystana fikcyjna, uproszczona baza danych, zawierająca statystyki wejść na stronę www. Tabela <code>stats</code> zawiera dane na temat wejść i jest powiązana z tabelą <code>sources</code> zawierającą źródła wejść (bezpośrednie, wyszukiwarka, odnośnik).</p>
<p><img class="aligncenter size-full wp-image-575" title="Model bazy danych: statystyki" src="http://blog.visionsoftware.pl/wp-content/uploads/2012/04/DB_model_stats_www.png" alt="Model bazy danych: statystyki strony www" width="474" height="175" /></p>
<p>Do wypełnienia tabeli fikcyjnymi danymi można użyć poniższej procedury:</p>
<pre class="brush: sql; title: ; notranslate">
DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `randstats`(insertLimit INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE randIP VARCHAR(15);
DECLARE randSoudce_id INT;
DECLARE randCreated_at DATETIME;

WHILE i &amp;lt; insertLimit DO
SET randIP = CONCAT_WS('.', FLOOR(1 + (RAND() * 255)), FLOOR(1 + (RAND() * 255)), 
FLOOR(1 + (RAND() * 255)), FLOOR(1 + (RAND() * 255)));
SET randSoudce_id = FLOOR(1 + (RAND() * 3));
SET randCreated_at = '2010-01-01 00:00:00' + INTERVAL FLOOR(1 + (RAND() * 60*24*7*4*12*2)) MINUTE;

INSERT INTO `stats`(source_id, created_at, IP) VALUES (randSoudce_id, randCreated_at, randIP);

SET i = i + 1;
END WHILE;
END $$

DELIMITER ;
</pre>
<pre class="brush: sql; title: ; notranslate">
call randstats(100000);
</pre>
<h3>Grupowanie względem dnia</h3>
<p>Powiedzmy, że zależy nam na wyciągnięciu statystyk wejść na stronę www z ostatniego miesiąca, z podziałem na poszczególne dni. W tym celu wystarczy skorzystać z funkcji <code>DATE()</code>, która zwraca samą datę z wyrażenia typu <code>datetime</code>.</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
DATE(created_at) AS dzien,
COUNT(*) AS ilosc
FROM stats
WHERE created_at BETWEEN &quot;2011-01-01 00:00:00&quot; AND &quot;2011-01-31 23:59:59&quot;
GROUP BY dzien
ORDER BY dzien;
</pre>
<p>Wynik wywołania zapytania będzie następujący:</p>
<pre>
dzien       ilosc
----------  ------
2011-01-01  168
2011-01-02  187
2011-01-03  190
2011-01-04  201
...
</pre>
<h3>Grupowanie względem tygodnia</h3>
<p>Oczywiście sytuacja jest analogiczna do powyższego, będziemy jednak pobierali statystyki z ostatniego roku. Do odpowiedniego grupowania potrzebna będzie funkcja <code>DATE_FORMAT()</code> lub <code>YEARWEEK()</code>. Lepiej będzie skorzystać z tej drugiej, z uwagi na lepszą wydajność.</p>
<p>Funkcja <code>YEARWEEK()</code> zwraca w MySQL sześciocyfrowy ciąg, określający rok oraz numer tygodnia. Pierwszym parametrem jest data, natomiast drugim, opcjonalnym, tryb w jakim ma działać. Określa czy tydzień zaczyna się od niedzieli, czy też od poniedziałku (domyślną wartością jest zmienna systemowa <code>default_week_format</code>).</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
YEARWEEK(created_at) AS tydzien,
COUNT(*) AS ilosc
FROM stats
WHERE created_at BETWEEN &quot;2011-01-03 00:00:00&quot; AND &quot;2011-04-31 23:59:59&quot;
GROUP BY tydzien
ORDER BY tydzien;
</pre>
<p>Wynik wywołania zapytania będzie następujący:</p>
<pre>
tydzien  ilosc
-------  ------
201101   1320
201102   1320
201103   1321
201104   1250
...
</pre>
<h3>Grupowanie względem miesiąca</h3>
<p>W tym przypadku najlepiej będzie skorzystać z funkcji <code>EXTRACT()</code> z odpowiednim parametrem <code>YEAR_MONTH</code>, dzięki czemu otrzymamy sześcioznakowy ciąg: połączenie roku oraz miesiąca. Pobranie pogrupowanych statystyk na dany miesiąc w roku 2011 może więc wyglądać następująco:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
EXTRACT(YEAR_MONTH FROM created_at) AS miesiac,
COUNT(*) AS ilosc
FROM stats
WHERE created_at BETWEEN &quot;2011-01-01 00:00:00&quot; AND &quot;2011-12-31 23:59:59&quot;
GROUP BY miesiac
ORDER BY miesiac;
</pre>
<p>Wynik wywołania zapytania będzie następujący:</p>
<pre>
miesiac  ilosc
-------  ------
201101   5738
201102   5130
201103   5713
201104   5405
...
</pre>
<h3>Grupowanie względem roku</h3>
<p>W tym przypadku sprawa jest prosta &#8211; wystarczy wykorzystać funkcję <code>YEAR()</code>, która zwraca rok z przekazanej daty:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
YEAR(created_at) AS rok,
COUNT(*) AS ilosc
FROM stats
GROUP BY rok
ORDER BY rok;
</pre>
<p>Wynik wywołania zapytania będzie następujący:</p>
<pre>
rok     ilosc
------  ------
2010    66793
2011    56547
</pre>
<h3>Grupowanie z uwzględnieniem typu</h3>
<p>Na zakończenie mała ciekawostka, czyli sposób na policzenie ilości wejść na stronę z podziałem na źródła. Do tego celu wykorzystamy pierwsze zapytanie (grupowanie na dzień), wymaga ono jednak pewnej modyfikacji, w postaci odpowiedniego wywołania funkcji <code>SUM()</code>.</p>
<p>Na początek należy przypomnieć, że źródła wejść w tabeli <code>sources</code> przedstawiają się następująco:</p>
<pre>
source_id  source_name
---------  -------------
1          bezpośrednie
2          wyszukiwarka
3          odnośnik
</pre>
<p>Tak, więc aby zliczyć wystąpienia poszczególnych źródeł w podziale na dni, należy użyć odpowiednio instrukcji <code>CASE</code> w połączeniu z <code>SUM()</code>. Widać to na poniższym przykładzie:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
DATE(created_at) AS dzien,
SUM(CASE WHEN`source_id` = 1 THEN 1 ELSE 0 END) AS bezposrednie,
SUM(CASE WHEN`source_id` = 2 THEN 1 ELSE 0 END) AS wyszukiwarka,
SUM(CASE WHEN`source_id` = 3 THEN 1 ELSE 0 END) AS odnosnik
FROM stats
WHERE created_at BETWEEN &quot;2011-01-01 00:00:00&quot; AND &quot;2011-01-31 23:59:59&quot;
GROUP BY dzien
ORDER BY dzien;
</pre>
<p>Wynik wywołania zapytania będzie następujący:</p>
<pre>
dzien       bezposrednie  wyszukiwarka  odnosnik
----------  ------------  ------------  ---------
2011-01-01  50            69            49
2011-01-02  77            47            63
2011-01-03  61            66            63
2011-01-04  62            55            84
2011-01-05  55            57            56
2011-01-06  69            64            59
...
</pre>
<p>Artykuł został oparty na tekście ze strony http://www.techfounder.net</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/bazy-danych/mysql-grupowanie-i-zliczanie-wedlug-dat.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wyrażenia regularne w MySQL</title>
		<link>https://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html</link>
		<comments>https://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html#comments</comments>
		<pubDate>Thu, 06 Jan 2011 14:33:42 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[like]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=132</guid>
		<description><![CDATA[Raz na jakiś czas zachodzi potrzeba wyszukania w bazie danych w określonym formacie.  Często wystarcza do tego celu zwykłe LIKE, jednak konstrukcja taka nie pomoże w bardziej skomplikowanych przypadkach. Wtedy warto skorzystać z REGEXP, dzięki czemu wykorzystamy możliwości wyrażeń regularnych. Podstawowym sposobem na wyszukiwania według określonego formatu jest w MySQL konstrukcja LIKE. Możemy w niej skorzystać z następujących konstrukcji: _ &#8211; każdy pojedynczy znak % &#8211; wiele dowolnych znaków (włączając w to ich brak) Przykładowe [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Raz na jakiś czas zachodzi potrzeba wyszukania w bazie danych w określonym formacie.  Często wystarcza do tego celu zwykłe LIKE, jednak konstrukcja taka nie pomoże w bardziej skomplikowanych przypadkach. Wtedy warto skorzystać z REGEXP, dzięki czemu wykorzystamy możliwości wyrażeń regularnych.<span id="more-132"></span></p>
<p>Podstawowym sposobem na wyszukiwania według określonego formatu jest w MySQL konstrukcja LIKE. Możemy w niej skorzystać z następujących konstrukcji:</p>
<ul>
<li>_ &#8211; każdy pojedynczy znak</li>
<li>% &#8211; wiele dowolnych znaków (włączając w to ich brak)</li>
</ul>
<p>Przykładowe zapytanie:</p>
<pre class="brush: sql; title: ; notranslate">select x from tabela where y like &quot;a_cd%h&quot;;</pre>
<p>zwróci wszystkie rekordy, dla których kolumna “x” rozpoczyna się od znaku &#8222;a&#8221;, po którym występuje jeden dowolny znak, następnie ciąg &#8222;cd&#8221;, nieokreślona liczba dowolnych znaków i na końcu znak &#8222;h&#8221;.</p>
<p>Takie wyszukiwania są jednak mocno ograniczone, często potrzebujemy wyboru bardziej szczegółowego formatu. Z pomocą mogą tu przyjść wyrażenia regularne, z którym możemy korzystać w MySQL poprzez konstrukcje REGEXP oraz NOT REGEXP (lub ich synonimy RLIKE oraz NOT RLIKE). W MySQL obowiązuje format Perla, czyli na przykład:</p>
<pre class="brush: sql; title: ; notranslate">select * from tabela where pole regexp '^[a-c]{1,3}X[0-9]*';</pre>
<p>Wyrażenia regularne w MySQL mogą zawierać następujące konstrukcje:</p>
<ul>
<li>^ &#8211; wyrażanie regularne rozpoczyna się od zdefiniowanego wzorca, np. ^x oznacza dowolny ciąg zaczynający się od znaku &#8222;x&#8221;</li>
<li>$ &#8211; wyrażanie regularne kończy się na zdefiniowanym wzorcu, np. x$ oznacza dowolny ciąg kończący się znakiem &#8222;x&#8221;</li>
<li>. &#8211; dowolny pojedynczy znak</li>
<li>* &#8211; zero lub więcej znaków, po jakim została umieszczona gwiazdka, np. x* oznacza dowolną liczbę wystąpień litery &#8222;x&#8221;, [0-9]* oznacza dowolną liczbę wystąpień jakiejkolwiek cyfry, (abc)* dowolną liczbę wystąpień ciągu &#8222;abc&#8221;, natomiast .* dowolny ciąg znaków</li>
<li>+ &#8211; jedno lub więcej wystąpienie określonego ciągu po jakim został umieszczony +, np. x+ oznacza jeden lub więcej &#8222;x&#8221;, [a-c]+ oznacza jedną lub więcej literę a, b lub c</li>
<li>? &#8211; zero lub jedno wystąpienie poprzedzającego znaku, np. x? oznacz zero lub jedno wystąpienie znaku &#8222;x&#8221;</li>
<li>[..] &#8211; zakres znaków, np. [a-zA-GXYZ5-9] oznacza wszystkie małe litery, duże od A do G oraz X, Y, Z, cyfry od 5-9. Można stosować zaprzeczenie poprzez ^, np. [^3-5] oznacza wszystkie ciągi, które nie zawierają liczb 3, 4 oraz 5.</li>
<li>| &#8211; logiczne lub, np. abc|def oznacza ciąg abc lub def</li>
<li>{n}, {n, m} &#8211; określa liczbę wystąpień poprzedzającego wyrażenia, np. a{4} oznacza znak &#8222;a&#8221; występujący dokładnie 4 razy, [a-c]{2,3} oznacza znak a, b lub c występujący od 2 do 3 razy. Można także stosować konstrukcję {0,}, która jest tożsama z operatorem * oraz {1,}, który oznacza to samo co +</li>
</ul>
<p>Aby użyć znaku specjalnego (+, -, *, &amp;, itp) musimy posłużyć się podwójnymi slashami. Przykładowo, aby odnaleźć ciąg 1+2 należy zastosować wyrażenie regularne w postaci 1\\+2.</p>
<p>Znaki w wyrażaniach regularnych możemy pisać wprost ([abc], \\+, \\’ itp.) lub stosując specjalną konstrukcję w postaci [.znaki.] . Przykładowo, aby znaleźć ciągi zawierające tyldę możemy posłużyć się zapytaniami:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT x FROM tabela REGEXP '\\~';
SELECT x FROM tabela REGEXP '[[.~.]]';
SELECT x FROM tabela REGEXP '[[.tilde.]]';

</pre>
<p>Tego typu zapisów jest dość sporo, przykładowe to:</p>
<ul>
<li>newline &#8211; nowa linia \n</li>
<li>tab &#8211; tabulacja \t</li>
<li>apostrophe &#8211; pojedynczy apostrof ‚</li>
<li>carriage-return &#8211; znak powrotu karetki \r</li>
<li>plus-sign &#8211; znak &#8222;plus&#8221; +</li>
</ul>
<p>Można także stosować klasy znaków, zawierające okresloną grupę wzorców. Na przykład [:alnum:] oznacza wszystkie znaki alfanumeryczne. Inne możliwości są następujące:</p>
<ul>
<li>alnum &#8211; znaki alfanumeryczne</li>
<li>alpha &#8211; litery alfabetu</li>
<li>blank &#8211; białe znaki</li>
<li>cntrl &#8211; znaki kontrolne</li>
<li>digit &#8211; cyfry</li>
<li>graph &#8211; znaki graficzne</li>
<li>lower &#8211; małe litery alfabetu</li>
<li>print &#8211; znaki graficzne lub spacje</li>
<li>punct &#8211; znaki interpunkcyjne</li>
<li>space &#8211; spacja, tabulacja, znak nowej linii oraz powrotu karetki</li>
<li>upper &#8211; duże litery alfabetu</li>
<li>xdigit &#8211; znaki heksadecymalne</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/bazy-danych/wyrazenia-regularne-w-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wydano nowe MySQL 5.5</title>
		<link>https://blog.visionsoftware.pl/bazy-danych/wydano-nowe-mysql-5-5.html</link>
		<comments>https://blog.visionsoftware.pl/bazy-danych/wydano-nowe-mysql-5-5.html#comments</comments>
		<pubDate>Sun, 19 Dec 2010 11:20:07 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[replikacja]]></category>
		<category><![CDATA[skalowalność]]></category>
		<category><![CDATA[wydajość]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=104</guid>
		<description><![CDATA[Od czasu gdy Oracle zarządza projektem MySQL nie ustają dyskusje na temat przyszłości tego systemu. Jeden ze współtwórców bazy, Michael Widenius, po odejściu z projektu postanowił stworzyć nawet własną alternatywę o nazwie MariaDB. Tymczasem wydana została kolejna wersja MySQL 5.5, wprowadzająca wiele nowych rozwiązań oraz zwiększająca wydajność. InnoDB domyślnym typem tabel Dotychczas zakładając tabele w MySQL, domyślnym typem był MyISAM. Zalecenia specjalistów są jednak jednoznaczne &#8211; znacznie lepiej korzystać z InnoDB. Stanowi ono rozwiązanie wydajniejsze, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Od czasu gdy Oracle zarządza projektem MySQL nie ustają dyskusje na temat przyszłości tego systemu. Jeden ze współtwórców bazy, Michael Widenius, po odejściu z projektu postanowił stworzyć nawet własną alternatywę o nazwie MariaDB. Tymczasem wydana została kolejna wersja MySQL 5.5, wprowadzająca wiele nowych rozwiązań oraz zwiększająca wydajność.<span id="more-104"></span></p>
<p><strong>InnoDB domyślnym typem tabel</strong></p>
<p>Dotychczas zakładając tabele w MySQL, domyślnym typem był MyISAM. Zalecenia specjalistów są jednak jednoznaczne &#8211; znacznie lepiej korzystać z InnoDB. Stanowi ono rozwiązanie wydajniejsze, oferujące transakcje, klucze obce oraz odzyskiwanie danych w przypadku awarii. Dlatego ten typ stał się domyłbym rozwiązaniem w nowej wersji bazy. Dodatkowo Oracle twierdzi, że w MySQL 5.5 InnoDB zostało zoptymalizowane pod kątem wielordzeniowych procesorów oraz poprawiono skalowalność.</p>
<p><strong>Poprawiona replikacja</strong></p>
<p>Wprowadzono dwa nowe mechanizmy. Półsynchroniczna replikacja poprawia niezawodność dzięki temu, że węzeł master może czekać, aż ostatni slave zaloguje transakcję. Drugim rozwiązaniem jest tzw. Replication HeartBeat. Dzięki temu użytkownik jest powiadamiany, że replikacja przestała działać. Realizowane jest to dzięki przesyłaniu w regularnych odstępach czasu od węzła master do węzłów slave informacji o pracy. Jeśli z jakiegoś powodu informacja taka nie dotrze, węzeł slave uzyska wiadomość, że połączenie z głównym serwerem nie działa prawidłowo.</p>
<p><strong>Zwiększona wydajność</strong></p>
<p>Oracle chwali się, że po aktualizacji do MySQL 5.5 wzrośnie ona wielokrotnie. Szczególnie ma to mieć miejsce w środowisku Windows, gdzie wg oficjalnych komunikatów producenta wydajność ma się poprawić nawet o 1500% w trybie Read/Write (benchmark SysBench). Nie ucieszy to jednak zbyt wielu osób, produkcyjne środowiska oparte na Winodws należą do rzadkości.</p>
<p>Jednak wzrost wydajności nastąpił także w przypadku Linux. W trybie Read/Write benchmark SysBench notował polepszenie do 360%, w trybie Read only do 200%. Jeśli wyniki te potwierdzą się w normalnych serwisach produkcyjnych, mogą znacząco wpłynąć na poprawę wydajności korzystających z nich aplikacji.</p>
<p><strong>Ładowanie danych z XML</strong></p>
<p>Pojawiła się nowa komenda LOAD XML, dzięki której można importować dane zawarte w pliku XML bezpośrednio do tabeli w bazie. Komenda ma następującą postać:</p>
<pre class="brush: sql; title: ; notranslate">

LOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE [db_name.]tbl_name
[CHARACTER SET charset_name]
[ROWS IDENTIFIED BY '&lt;tagname&gt;']
[IGNORE number [LINES | ROWS]]
[(column_or_user_var,...)]
[SET col_name = expr,...]
</pre>
<p>Polecenie umożliwia import z plików XML przygotowanych w trzech różnych formatach:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;row column1=&quot;value1&quot; column2=&quot;value2&quot; .../&gt;
</pre>
<pre class="brush: xml; title: ; notranslate">
&lt;row&gt;
&lt;column1&gt;value1&lt;/column1&gt;
&lt;column2&gt;value2&lt;/column2&gt;
&lt;/row&gt;
</pre>
<pre class="brush: xml; title: ; notranslate">
&lt;row&gt;&lt;field name='column1'&gt;value1&lt;/field&gt;
&lt;field name='column2'&gt;value2&lt;/field&gt;
&lt;/row&gt;

</pre>
<p><strong> </strong></p>
<p><strong>Funkcja TO_SECONDS()</strong></p>
<p>Nowa funkcja, która pomaga w zarządzaniu datami i czasem. Przyjmuje jako parametr datę z ewentualnym czasem, zwraca natomiast liczbę sekund jaka upłynęła od roku 0. Poniżej przedstawiono przykładowe działanie:</p>
<pre class="brush: sql; title: ; notranslate">

mysql&gt; SELECT TO_SECONDS(950501);
 -&gt; 62966505600
mysql&gt; SELECT TO_SECONDS('2009-11-29');
 -&gt; 63426672000
mysql&gt; SELECT TO_SECONDS('2009-11-29 13:43:32');
 -&gt; 63426721412
mysql&gt; SELECT TO_SECONDS( NOW() );
 -&gt; 63426721458
</pre>
<p><strong>Oprócz tego…</strong></p>
<p>Z innych zmian wprowadzonych w MySQL 5.5 warto wymienić lepsze mechanizmy zarządzania, ulepszone partycjonowanie tabel, zmianę w składni SIGNAL/RESIGNAL oraz poprawę diagnostyki w postaci nowego PERFORMANCE_SCHEMA.</p>
<p>Pełna lista zmian została przedstawiona w dokumencie, który możemy zamówić na maila na <a title="Co nowego w MySQL 5.5" href="http://www.mysql.com/why-mysql/white-papers/mysql-wp-whatsnew-mysql-55.php ">stronie projektu MySQL</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.visionsoftware.pl/bazy-danych/wydano-nowe-mysql-5-5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
