Ukryte funkcje MySQL

zamknięty. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Współpracuję z Microsoftem SQL Server od wielu lat, ale dopiero niedawno zacząłem używać MySQL z moimi aplikacjami internetowymi, a ja jestem głodny wiedzy.

Aby kontynuować długą linię pytań "hidden feature" , chciałbym poznać jakieś ukryte lub przydatne funkcje MySQL, które mam nadzieję poprawią moją wiedzę o tej bazie danych open source.

Author: GateKiller, 2008-12-15

20 answers

Skoro wyznaczyłeś nagrodę, podzielę się moimi trudnymi sekretami...

Ogólnie rzecz biorąc, wszystkie SQL, które dziś dostroiłem, wymagały użycia zapytań podrzędnych. Po przybyciu ze świata baz danych Oracle rzeczy, które brałem za pewnik, nie działały tak samo z MySQL. A moje czytanie na temat tuningu MySQL sprawia, że dochodzę do wniosku, że MySQL stoi za Oracle pod względem optymalizacji zapytań.

Podczas gdy proste zapytania wymagane dla większości aplikacji B2C mogą działać dobrze dla MySQL, większość zagregowanego typu raportowania z zapytań potrzebnych do raportowania inteligencji wydaje się wymagać sporo planowania i reorganizacji zapytań SQL, aby poprowadzić MySQL do ich szybszego wykonania.

Administracja:

max_connections liczba jednoczesnych połączeń. Domyślną wartością jest 100 połączeń (151 od wersji 5.0) - bardzo małe.

Uwaga:

Połączenia wymagają pamięci, a system operacyjny może nie być w stanie obsłużyć wielu połączeń.

Binaria MySQL dla Linuksa / x86 pozwalają na do 4096 jednoczesnych po3 ± czeñ, ale samodzielnie skompilowane binaria czêsto maj ± mniejszy limit.

Ustaw table_cache, aby pasował do liczby otwartych tabel i jednoczesnych połączeń. Obserwuj wartość open_tables i jeśli szybko rośnie, musisz zwiększyć jej rozmiar.

Uwaga:

2 poprzednie parametry mogą wymagać dużej ilości otwartych plików. 20 + max_connections+table_cache * 2 jest dobrym oszacowaniem tego, czego potrzebujesz. MySQL na Linuksie ma opcję open_file_limit, ustaw to limit.

Jeśli masz złożone zapytania sort_buffer_size i tmp_table_size mogą być bardzo ważne. Wartości będą zależeć od złożoności zapytania i dostępnych zasobów, ale zalecane są odpowiednio 4MB i 32MB.

Uwaga: są to wartości "na połączenie", wśród read_buffer_size, read_rnd_buffer_size i innych, co oznacza, że ta wartość może być potrzebna dla każdego połączenia. Tak więc, należy wziąć pod uwagę swój ładunek i dostępny zasób podczas ustawiania tych parametry. Na przykład sort_buffer_size jest alokowany tylko wtedy, gdy MySQL musi wykonać sortowanie. Uwaga: uważaj, aby nie zabrakło pamięci.

Jeśli masz wiele połączeń (np. witrynę internetową bez trwałych połączeń), możesz poprawić wydajność, ustawiając thread_cache_size na wartość niezerową. 16 to dobra wartość na początek. Zwiększ wartość, dopóki threads_created nie zwiększy się bardzo szybko.

KLUCZ PODSTAWOWY:

Może być tylko jedna kolumna AUTO_INCREMENT każda tabela musi być indeksowana i nie może mieć wartości domyślnej

Klucz jest zwykle synonimem indeksu. Atrybut Key PRIMARY KEY może być również określony jako tylko klucz, gdy podany jest w definicji kolumny. Zostało to zaimplementowane w celu kompatybilności z innymi systemami baz danych.

Klucz podstawowy jest unikalnym indeksem, w którym wszystkie kolumny klucza muszą być zdefiniowane jako NOT NULL

Jeśli klucz podstawowy lub indeks UNIQUE składa się tylko z jednej kolumny, która ma typ integer, możesz również odnieść się do do kolumny jako "_rowid" w poleceniach SELECT.

W MySQL nazwa klucza głównego to PRIMARY

Obecnie tylko InnoDB (v5.1?) tabele obsługują klucze obce.

Zazwyczaj tworzysz wszystkie indeksy potrzebne podczas tworzenia tabel. Każda kolumna zadeklarowana jako klucz podstawowy, klucz, Unikat lub indeks zostanie zindeksowana.

NULL oznacza "brak wartości". Aby sprawdzić wartość NULL, nie można użyć operatorów porównania arytmetycznego, takich jak=,. Użycie zamiast tego operatory IS NULL i IS NOT NULL:

NO_AUTO_VALUE_ON_ZERO wyłącza automatyczny przyrost dla 0 tak, że tylko NULL generuje następny numer sekwencji. Ten tryb może być przydatny, jeśli 0 zostało zapisane w kolumnie AUTO_INCREMENT tabeli. (Przy okazji, przechowywanie 0 nie jest zalecaną praktyką.)

Aby zmienić wartość licznika AUTO_INCREMENT używanego dla nowych wierszy:

ALTER TABLE mytable AUTO_INCREMENT = value; 

Lub SET INSERT_ID = value;

O ile nie określono inaczej, wartość będzie zacznij od: 1000000 lub określ go w ten sposób:

...) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1

Znaczniki czasu:

Wartości kolumn znacznika czasu są konwertowane z bieżącej strefy czasowej na UTC do przechowywania, i od UTC do bieżącej strefy czasowej do pobrania.

Http://dev.mysql.com/doc/refman/5.1/en/timestamp.html Dla jednej kolumny znacznika czasu w tabeli można przypisać bieżący znacznik czasu jako wartość domyślną i automatyczną aktualizację wartość.

Jedna rzecz, na którą należy zwrócić uwagę podczas używania jednego z tych typów klauzuli WHERE, najlepiej zrobić WHERE datecolumn = FROM_UNIXTIME(1057941242) i nie WHERE UNIX_TIMESTAMP(datecolumn) = 1057941242. wykonanie tego ostatniego nie wykorzysta indeksu w tej kolumnie.

Http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

 UNIX_TIMESTAMP() 
 FROM_UNIXTIME() 
 UTC_DATE()
 UTC_TIME()
 UTC_TIMESTAMP()

Jeśli przekonwertujesz datetime na Unix timestamp w MySQL:
A następnie dodać 24 godziny do it:
A potem przekonwertować go z powrotem do datetime magicznie traci godzinę!

Oto, co się dzieje. Podczas konwersji Unix timestamp z powrotem do datetime Strefa czasowa jest brana pod uwagę i tak się składa, że między 28 a 29 października 2006 roku straciliśmy czas letni i straciliśmy godzinę.

Począwszy od MySQL 4.1.3, funkcje CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE () i FROM_UNIXTIME() zwracają wartości w połączeniu bieżąca Strefa czasowa , która jest dostępna jako wartość zmiennej systemowej time_zone. Ponadto UNIX_TIMESTAMP() zakłada, że jej argument jest wartością datetime w bieżącej strefie czasowej.

Bieżące ustawienie strefy czasowej nie wpływa na wartości wyświetlane przez funkcje takie jak UTC_TIMESTAMP() lub wartości w kolumnach daty, czasu lub DATETIME.

Uwaga: przy aktualizacji tylko aktualizuje DateTime, jeśli pole zostanie zmienione, jeśli aktualizacja nie spowoduje zmiany pól wtedy DateTime nie jest aktualizowany!

Dodatkowo, pierwszym znacznikiem czasu jest domyślnie zawsze AUTOUPDATE, nawet jeśli nie podano

Podczas pracy z datami, prawie zawsze konwetuję do daty Juliańskiej, ponieważ matematyka danych jest wtedy prostą sprawą dodawania lub odejmowania liczb całkowitych i sekund od północy z tego samego powodu. Rzadko potrzebuję czasu o drobniejszej ziarnistości niż sekundy.

Oba te mogą być zapisane jako 4-bajtowa liczba całkowita, a jeśli spacja jest naprawdę ciasna, może być w UNIX time (sekundy od epoki 1/1/1970) jako niepodpisana liczba całkowita, która będzie dobra do około 2106 jako:

' secs in 24Hrs = 86400

' Signed Integer max val = 2,147,483,647 - może pomieścić 68 lat sekund

' Unsigned Integer max val = 4,294,967,295 - może pomieścić 136 lat sekund

Protokół Binarny:

MySQL 4.1 wprowadził protokół binarny, który umożliwia wysyłanie wartości danych nie będących ciągami i zwrócony w natywnym formacie bez konwersji do i z formatu łańcuchowego. (Bardzo przydatne)

Pomijając, mysql_real_query() jest szybszy niż mysql_query (), ponieważ nie wywołuje strlen() operować na łańcuchu instrukcji.

Http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html Protokół binarny obsługuje instrukcje przygotowane po stronie serwera i umożliwia transmisję wartości danych w natywnym formacie. Protokół binarny przeszedł sporo poprawek podczas wcześniejszego wydania MySQL 4.1.

Możesz użyć makra IS_NUM (), aby sprawdzić, czy pole ma typ liczbowy. Przekaż wartość typu do is_num () i zostanie ona obliczona na TRUE, jeśli pole jest numeryczne:

Należy zauważyć, że dane binarne mogą być wysyłane wewnątrz zwykłego zapytania, jeśli je unikniesz i zapamiętasz, że MySQL wymaga tylko , że Ukośnik i znak cudzysłowu mają być zabezpieczone. Tak więc jest to naprawdę łatwy sposób na wstawianie krótszych ciągów binarnych, takich jak zaszyfrowane / solone hasła na przykład.

Serwer Główny:

Http://www.experts-exchange.com/Database/MySQL/Q_22967482.html

Http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2

GRANT REPLICATION SLAVE ON . do slave_user identyfikowanego przez 'slave_password'

#Master Binary Logging Config  STATEMENT causes replication 
              to be statement-based -  default

log-bin=Mike
binlog-format=STATEMENT
server-id=1            
max_binlog_size = 10M
expire_logs_days = 120    


#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2

Plik dziennika binarnego musi powinno być:

Http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

Http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/

Http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html

Http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

Http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html

Możesz usunąć wszystkie pliki dziennika binarnego z instrukcją Reset MASTER lub ich podzbiór z instrukcją PURGE MASTER

--result-file=binlog.txt TrustedFriend-bin.000030

Normalizacja:

Http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html

Funkcje UDF

Http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx

Http://souptonuts.sourceforge.net/readme_mysql.htm

DataTypes:

Http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

Http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2

Http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/

Należy zauważyć, że w tabeli mieszanej z CHAR i VARCHAR, mySQL zmieni CHAR 's to VARCHAR' s

Nie jest to jednak możliwe w przypadku, gdy nie jest to możliwe.]}

MySQL zawsze przedstawia daty z pierwszym rokiem, zgodnie ze standardowymi specyfikacjami SQL i ISO 8601

Misc:

Wyłączenie niektórych funkcji MySQl spowoduje powstanie mniejszych plików z danymi i szybszy dostęp. Na przykład:

--datadir określi katalog danych i

--skip-innodb wyłączy opcję inno i zapisze ty 10-20m

Więcej tutaj http://dev.mysql.com/tech-resources/articles/mysql-c-api.html

Pobierz Rozdział 7-Za Darmo

InnoDB jest transakcyjny, ale wiąże się z tym narzut wydajności. Moje tabele są wystarczające dla 90% moich projektów. Tabele bez transakcji (MyISAM) mają kilka zalet własnych, z których wszystkie występują, ponieważ: {]}

Nie ma transakcji:

[[10]} Much faster

Niższe wymagania dotyczące miejsca na dysku

Mniej pamięci do wykonania aktualizacji

Każda tabela MyISAM jest przechowywana na dysku w trzech plikach. Pliki mają Nazwy zaczynające się od nazwy tabeli i mają rozszerzenie wskazujące typ pliku. A .plik frm przechowuje format tabeli. Plik z danymi ma .Rozszerzenie Myd (MYData). Plik indeksu zawiera .Rozszerzenie MYI (MYIndex).

Te pliki można skopiować do nienaruszonego miejsca przechowywania bez użycia tworzenie kopii zapasowych przez administratorów MySQL jest czasochłonne (podobnie jak przywracanie)

Sztuką jest zrobić kopię tych plików, a następnie upuścić tabelę. Po odłożeniu plików MySQl rozpozna je i zaktualizuje śledzenie tabeli.

Jeśli musisz wykonać kopię zapasową / przywrócić,

Przywracanie kopii zapasowej lub importowanie z istniejącego pliku zrzutu może zająć dużo czasu w zależności od liczby indeksów i kluczy głównych w każdej tabeli. Możesz znacznie przyspieszyć ten proces modyfikując oryginalny plik zrzutu, otaczając go następującym tekstem:

SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;

.. your dump file ..

SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;

Aby znacznie zwiększyć szybkość przeładowania, dodaj polecenie SQL SET AUTOCOMMIT = 0; Na początku pliku zrzutu i dodaj polecenie COMMIT; na końcu.

Domyślnie autocommit jest włączony, co oznacza, że każde polecenie insert w plik zrzutu zostanie potraktowany jako osobna transakcja i zapisany na dysk przed uruchomieniem kolejnej. Jeśli nie dodasz tych poleceń, przeładuj duża baza danych w InnoDB może zająć wiele godzin...

Maksymalna wielkość wiersza w tabeli MySQL wynosi 65 535 bajtów W przeciwieństwie do innych języków, w których VARCHAR jest używany, nie jest używany.]}

Wartości VARCHAR nie są wypełniane, gdy są przechowywane. Spacje końcowe są zachowywane, gdy wartości są przechowywane i pobierane, zgodnie ze standardowym SQL.

Wartości CHAR i VARCHAR w MySQL są porównywane bez względu na końcowe miejsca.

Użycie CHAR przyspieszy dostęp tylko wtedy, gdy cały rekord ma stały rozmiar. To jest, jeśli używasz dowolnego obiektu o zmiennej wielkości, możesz równie dobrze zmienić wszystkie z nich. Nie zyskujesz prędkości, używając znaku w tabeli, która zawiera również VARCHAR.

Limit VARCHAR 255 znaków został podniesiony do 65535 znaków od MySQL 5.0.3

Wyszukiwanie pełnotekstowe jest obsługiwane tylko dla tabel MyISAM.

Http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

Kolumny BLOB nie mają zestawu znaków, a sortowanie i porównywanie oparte są na wartości liczbowe bajtów w wartościach kolumn

Jeśli tryb strict SQL nie jest włączony i przypisujesz wartość do obiektu BLOB lub kolumny tekstowej, która przekracza maksymalną długość kolumny, wartość jest obcięta, aby pasowała i generowane jest Ostrzeżenie.

Przydatne Polecenia:

Sprawdź tryb ścisły: Wybierz @@ global.sql_mode;

Wyłącz tryb ścisły:

SET @ @ global.sql_mode=";

SET @ @ global.sql_mode= 'MYSQL40'

Lub usunąć: SQL-mode= " STRICT_TRANS_TABLES,...

POKAŻ KOLUMNY Z mytable

Wybierz max (namecount) jako virtualcolumn z mytable ORDER BY virtualcolumn

Http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html

Http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id ()

Pobiera PK ostatniego wiersza wstawionego w bieżącym wątku max(pkcolname) pobiera Ostatnie PK ogółem.

Uwaga: jeśli tabela jest pusta max(pkcolname) zwraca 1 mysql_insert_id() konwertuje Typ zwracanej funkcji natywnego API MySQL C mysql_insert_id() do typu long (nazwany int w PHP).

Jeśli twoja kolumna AUTO_INCREMENT ma typ kolumny BIGINT, wartość zwracana przez mysql_insert_id() będzie niepoprawne. Zamiast tego użyj wewnętrznej funkcji MySQL SQL LAST_INSERT_ID () w zapytaniu SQL.

Http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Tylko zauważ, że gdy próbujesz wstawić dane do tabeli i otrzymujesz błąd:

Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’

Używanie czegoś w rodzaju

INSERT INTO table (this, that) VALUES ($this, $that)

To dlatego, że nie masz żadnych apostrofów wokół wartości, które próbujesz przykleić do tabeli. Więc powinieneś zmienić kod na:

INSERT INTO table (this, that) VALUES ('$this', '$that') 

Przypomnienie, że " są używane do definiowania pól, baz danych lub tabel MySQL, a nie wartości;)

Utracone połączenie z serwerem podczas zapytanie:

Http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

Http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

Http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html

Http://dev.mysql.com/doc/refman/5.1/en/show-variables.html

Http://dev.mysql.com/doc/refman/5.1/en/option-files.html

Http://dev.mysql.com/doc/refman/5.1/en/error-log.html

Tuning Queries

Http://www.artfulsoftware.com/infotree/queries.php?&bw=1313

To powinno wystarczyć, by zdobyć premię... Owoc wielu godzin i wielu projektów z wielką darmową bazą danych. Tworzę serwery danych aplikacji głównie na platformach windows z MySQL. Najgorszy bałagan, jaki musiałem wyprostować, to

The ultimate MySQL legacy database nightmare

Wymagało to szeregu aplikacji do przetworzenia tabel w coś użytecznego przy użyciu wielu sztuczek wymienionych tutaj.

Jeśli uznałeś to za zdumiewająco pomocne, podziękuj, głosując.

Zobacz także inne moje artykuły i dokumenty na: www.coastrd.com

 161
Author: Mike Trader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:16

Jedną z nie tak ukrytych cech MySQL jest to, że nie jest naprawdę dobry w bycie zgodnym z SQL, cóż, nie błędy naprawdę, ale, więcej gotchas ... :-)

 22
Author: mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 16:21:00

Polecenie sprawdzające, jakie tabele znajdują się obecnie w pamięci podręcznej:

mysql> SHOW open TABLES FROM test;
+----------+-------+--------+-------------+
| DATABASE | TABLE | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | a     |      3 |           0 |
+----------+-------+--------+-------------+
1 row IN SET (0.00 sec)

(z MySQL performance blog)

 21
Author: Eran Galperin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 16:30:24

Polecenie, aby dowiedzieć się, kto co robi:

mysql> show processlist;
show processlist;
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time | State                            | Info             |
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
|  1 | root        | localhost:32893 | NULL | Sleep   |    0 |                                  | NULL             |
|  5 | system user |                 | NULL | Connect |   98 | Waiting for master to send event | NULL             |
|  6 | system user |                 | NULL | Connect | 5018 | Reading event from the relay log | NULL             |
+-----+------+-----------+---------+---------+-------+-------+------------------+
3 rows in set (0.00 sec) 

I możesz zabić proces za pomocą:

mysql>kill 5 
 15
Author: Christian C. Salvadó,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 16:22:43

Szczególnie podoba mi się wbudowana obsługa MySQL dla inet_ntoa() i inet_aton(). Sprawia to, że obsługa adresów IP w tabelach jest bardzo prosta (przynajmniej tak długo, jak są to tylko adresy IPv4!)

 11
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-22 10:20:28

I love on duplicate key (AKA upsert, merge) dla wszystkich rodzajów liczników tworzonych leniwie:

insert into occurances(word,count) values('foo',1),('bar',1) 
  on duplicate key cnt=cnt+1

Możesz wstawić wiele wierszy w jednym zapytaniu i natychmiast obsługiwać zduplikowany indeks dla każdego z wierszy.

 11
Author: porneL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-15 13:45:56

Znowu-nie do końca ukryte funkcje, ale naprawdę przydatne:

Funkcja

Łatwo chwycić DDL:

SHOW CREATE TABLE CountryLanguage

Wyjście:

CountryLanguage | CREATE TABLE countrylanguage (
  CountryCode char(3) NOT NULL DEFAULT '',
  Language char(30) NOT NULL DEFAULT '',
  IsOfficial enum('T','F') NOT NULL DEFAULT 'F',
  Percentage float(4,1) NOT NULL DEFAULT '0.0',
  PRIMARY KEY (CountryCode,Language)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Funkcja: GROUP_CONCAT () funkcja agregująca Tworzy skonkatenowany ciąg argumentów na detale i agreguje łącząc je na Grupę.

Przykład 1: proste

SELECT   CountryCode
,        GROUP_CONCAT(Language) AS List
FROM     CountryLanguage
GROUP BY CountryCode             

Wyjście:

+-------------+------------------------------------+
| CountryCode | List                               |
+-------------+------------------------------------+
| ABW         | Dutch,English,Papiamento,Spanish   |
. ...         . ...                                .
| ZWE         | English,Ndebele,Nyanja,Shona       |
+-------------+------------------------------------+

Przykład 2: wielokrotność argumenty

SELECT   CountryCode
,        GROUP_CONCAT(
             Language
,            IF(IsOfficial='T', ' (Official)', '')
         )               AS List
FROM     CountryLanguage
GROUP BY CountryCode

Wyjście:

+-------------+---------------------------------------------+
| CountryCode | List                                        |
+-------------+---------------------------------------------+
| ABW         | Dutch (Official),English,Papiamento,Spanish |
. ...         . ...                                         .
| ZWE         | English (Official),Ndebele,Nyanja,Shona     |
+-------------+---------------------------------------------+

Przykład 3: użycie niestandardowego separatora

SELECT   CountryCode
,        GROUP_CONCAT(Language SEPARATOR ' and ') AS List
FROM     CountryLanguage
GROUP BY CountryCode

Wyjście:

+-------------+----------------------------------------------+
| CountryCode | List                                         |
+-------------+----------------------------------------------+
| ABW         | Dutch and English and Papiamento and Spanish |
. ...         . ...                                          .
| ZWE         | English and Ndebele and Nyanja and Shona     |
+-------------+----------------------------------------------+

Przykład 4: kontrolowanie kolejności elementów listy

SELECT   CountryCode
,        GROUP_CONCAT(
         Language
         ORDER BY CASE IsOfficial WHEN 'T' THEN 1 ELSE 2 END DESC
         ,        Language
         )               AS List
FROM     CountryLanguage
GROUP BY CountryCode

Wyjście:

+-------------+------------------------------------+
| CountryCode | List                               |
+-------------+------------------------------------+
| ABW         | English,Papiamento,Spanish,Dutch,  |
. ...         . ...                                .
| ZWE         | Ndebele,Nyanja,Shona,English       |
+-------------+------------------------------------+

Funkcja: COUNT (DISTINCT ) z wieloma wyrażeniami

Możesz używać wielu wyrażeń w liczniku (DISTINCT ...) wyrażenie liczące liczbę kombinacji.

SELECT COUNT(DISTINCT CountryCode, Language) FROM CountryLanguage

Funkcja / Gotcha: nie trzeba dołącz do grupy wyrażenia niezagregowane według listy

Większość RDBMS-es wymusza grupę zgodną z SQL92, która wymaga, aby wszystkie wyrażenia niezagregowane na liście SELECT pojawiały się w grupie BY. W tych RDBMS-es, to stwierdzenie:

SELECT     Country.Code, Country.Continent, COUNT(CountryLanguage.Language)
FROM       CountryLanguage 
INNER JOIN Country 
ON         CountryLanguage.CountryCode = Country.Code
GROUP BY   Country.Code

Nie jest poprawna, ponieważ lista SELECT zawiera niezagregowaną kolumnę Country.Kontynent, który nie występuje w grupie według listy. W tych RDBMS-es musisz zmodyfikować listę GROUP BY, aby odczytać

GROUP BY   Country.Code, Country.Continent

Lub musisz dodać jakieś bezsensowne Agregaty do kraju.Kontynent, na przykład

SELECT     Country.Code, MAX(Country.Continent), COUNT(CountryLanguage.Language)
Rzecz w tym, że logicznie nie ma nic, co by wymagało tego kraju./ Align = "left" / Widzisz, Country.Kod jest podstawowym kluczem tabeli krajów. Kraj.Kontynent jest również kolumną z tabeli krajów i dlatego jest przez definicje funkcjonalnie zależny od głównego klucza kraju.Kod. Zatem w kraju musi istnieć dokładnie jedna wartość.Kontynent dla każdego odrębnego kraju.Kod. Jeśli zdajesz sobie sprawę z tego, że nie ma sensu agregować go (jest tylko jedna wartość, PRAWDA) ani grupować według niego (ponieważ nie sprawi to, że wynik będzie bardziej unikalny, ponieważ już grupujesz przez na pk)

Anyway - MySQL pozwala na dołączenie niezagregowanych kolumn do listy SELECT bez konieczności dodawania ich do klauzuli GROUP BY.

The gotcha with this is that MySQL doesn ' t protect you in case you happen to use a non-zagregowane column. Więc zapytanie Tak:

SELECT     Country.Code, COUNT(CountryLanguage.Language), CountryLanguage.Percentage
FROM       CountryLanguage 
INNER JOIN Country 
ON         CountryLanguage.CountryCode = Country.Code
GROUP BY   Country.Code

Zostanie wykonana bez reklamacji, ale kraj.Kolumna procentowa będzie zawierać bezsensowne (to znaczy, ze wszystkich języków procenty, jedna z dostępnych wartości procentu zostanie wybrana losowo lub przynajmniej poza Twoją kontrolą.

Zobacz: Obalanie Grupy Przez Mity

 10
Author: 4 revs, 3 users 77%anon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-29 09:44:46

Polecenie "pager" w kliencie

Jeśli masz, powiedzmy, 10 000 wierszy w wyniku i chcesz je wyświetlić (zakłada się, że dostępne są polecenia "less" I "tee", co zwykle ma miejsce pod Linuksem; w Windows YMMV.)

pager less
select lots_of_stuff FROM tbl WHERE clause_which_matches_10k_rows;

I dostaniesz je w przeglądarce plików "less", dzięki czemu będziesz mógł je ładnie przeglądać, wyszukiwać itp.

Również

pager tee myfile.txt
select a_few_things FROM tbl WHERE i_want_to_save_output_to_a_file;

Wygodnie zapisze do pliku.

 7
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 06:14:55

Niektóre rzeczy mogą Cię zainteresować:

<query>\G -- \G in the CLI instead of the ; will show one column per row
explain <query>; -- this will show the execution plan for the query
 6
Author: SorinV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 20:52:40

Nie jest to funkcja ukryta, ale jednak przydatna: http://mtop.sourceforge.net/

 4
Author: Eddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-06 00:54:37

Oto kilka moich porad - pisałam o nich na blogu ( Link)

  1. nie musisz używać znaku '@' przy deklarowaniu zmiennych.
  2. musisz użyć ogranicznika (domyślnie jest to';'), aby rozgraniczyć koniec instrukcji - Link
  3. Jeśli próbujesz przenieść dane między MS-SQL 2005 i mySQL, istnieje kilka obręczy do przeskoczenia - Link
  4. sprawdzanie wielkości liter w mySQL - link
 3
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 06:19:04

Jeśli zamierzasz pracować z dużymi i/lub wysokimi bazami danych InnoDb naucz się i zrozum "Pokaż status INNODB" mysql Performance Blog , stanie się Twoim przyjacielem.

 3
Author: Hawk Kroeger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-03 06:45:16

Jeśli używasz CmdLine Mysq, możesz wchodzić w interakcje z wierszem poleceń (na maszynach Linuksowych - Nie wiem, czy jest równoważny efekt na Windows) za pomocą krzyku/wykrzyknika. Na przykład:

\! cat file1.sql

Wyświetli kod pliku 1.sql. Aby zapisać swoje oświadczenie i zapytanie do pliku, użyj obiektu tee

\T filename

Aby to wyłączyć użyj \t

Na koniec, aby uruchomić skrypt, który już zapisałeś, użyj "source filename". Oczywiście normalną alternatywą jest kierowanie w skrypcie nazwa przy uruchamianiu mysql z linii poleceń:

    mysql -u root -p < case1.sql
Mam nadzieję, że to się komuś przyda !

Edit: właśnie przypomniałem sobie o innym - podczas wywoływania mysql z linii poleceń można użyć przełącznika-t, aby wyjście było w formacie tabeli - prawdziwe dobrodziejstwo dla niektórych zapytań (chociaż oczywiście kończenie zapytań za pomocą \G, jak wspomniano w innym miejscu Tutaj jest również pomocne w tym zakresie). Dużo więcej o różnych przełącznikach Narzędzie wiersza poleceń

Właśnie odkryłem zgrabny sposób na zmianę kolejność sortowania (normalnie use Case...) Jeśli chcesz zmienić kolejność sortowania (być może sortowanie według 1, 4, 3 ,2 zamiast 1, 2, 3,4), możesz użyć funkcji pola w klauzuli Order by. Na przykład

Order By Field(sort_field,1,4,3,2)

 3
Author: DBMarcos99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:27

Myślę, że to nie jest specyficzne dla MySQL, ale dla mnie pouczające:

Zamiast pisać

WHERE (x.id > y.id) OR (x.id = y.id AND x.f2 > y.f2) 

Możesz po prostu napisać

WHERE (x.id, x.f2) > (y.id, y.f2)
 3
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-21 12:14:54

Mysqlsla - jedno z bardzo często używanych narzędzi do analizy dziennika zapytań. Możesz zobaczyć top 10 worsts zapytań od u Ostatnio rozwijane powolne dzienniki zapytań. Może również powiedzieć, ile razy złe zapytanie zostało wywołane i ile całkowitego czasu zajęło na serwerze.

 2
Author: pawan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-22 11:53:25

Właściwie udokumentowane , ale bardzo irytujące: automatyczne konwersje dla nieprawidłowych dat i innych nieprawidłowych danych wejściowych.

Przed MySQL 5.0.2, MySQL jest wybaczanie nielegalnych lub niewłaściwych wartości danych i przymusza je do wartości prawnych dla wprowadzania danych. W MySQL 5.0.2 i nowszych, które pozostaje domyślnym zachowaniem, ale można zmienić tryb SQL serwera, aby wybrać bardziej tradycyjne traktowanie złych wartości tak, że serwer odrzuca je i przerywa instrukcję, w której one występuje.

Jeśli chodzi o daty: czasami będziesz "szczęśliwy", gdy MySQL nie dostosuje danych wejściowych do pobliskich ważnych dat, ale zamiast tego przechowuje je jako 0000-00-00, co z definicji jest nieprawidłowe. Jednak nawet wtedy mogłeś chcieć, aby MySQL nie powiódł się, zamiast po cichu przechowywać tę wartość dla Ciebie.

 2
Author: Arjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-12 12:20:12

Wbudowany SQL Profiler .

 2
Author: Eugene Yarmash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-16 14:57:53

InnoDB domyślnie przechowuje wszystkie tabele w jednej globalnej przestrzeni tabel, która nigdy nie zmniejszy się .

Możesz użyć innodb_file_per_table, który umieści każdą tabelę w osobnej przestrzeni tabel, która zostanie usunięta po upuszczeniu tabeli lub bazy danych.

Zaplanuj to z wyprzedzeniem, ponieważ musisz zrzucić i przywrócić bazę danych, aby odzyskać miejsce w przeciwnym razie.

Korzystanie Z Tabel Tablespaces

 1
Author: serbaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 08:08:23

Jeśli wstawisz do kolumny datetime pusty łańcuch wartości"", MySQL zachowa wartość jako 00/00/0000 00:00:00. W przeciwieństwie do Oracle, który zapisuje wartość null.

 1
Author: Devid G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-01 12:57:39

Podczas moich benchmarków z dużymi zbiorami danych i polami DATETIME, zawsze wolniej jest wykonywać to zapytanie:

SELECT * FROM mytable
WHERE date(date_colum) BETWEEN '2011-01-01' AND ''2011-03-03';

Niż to podejście:

SELECT * FROM mytable
WHERE date_column BETWEEN '2011-01-01 00:00:00' AND '2011-03-03 23:59:59'
 1
Author: Osvaldo Mercado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-08 17:15:48