Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ukryte funkcje MySQL

Ponieważ wyznaczyłeś nagrodę, podzielę się moimi ciężko zdobytymi sekretami...

Ogólnie rzecz biorąc, wszystkie dostrojone dzisiaj przeze mnie SQL wymagały użycia podzapytań. Pochodząc ze świata baz danych Oracle, rzeczy, które uważałem za oczywiste, nie działały tak samo z MySQL. A moja lektura na temat strojenia MySQL sprawia, że ​​dochodzę do wniosku, że MySQL stoi za Oracle pod względem optymalizacji zapytań.

Podczas gdy proste zapytania wymagane w większości aplikacji B2C mogą dobrze działać w przypadku MySQL, większość zapytań typu zbiorczego raportowania potrzebnych do raportowania inteligencji wydaje się wymagać sporego zaplanowania i przeorganizowania zapytań SQL, aby skłonić MySQL do ich szybszego wykonywania.

Administracja:

max_connections to liczba jednoczesnych połączeń. Domyślna wartość to 100 połączeń (151 od 5.0) - bardzo małe.

Uwaga:

połączenia zajmują pamięć, a system operacyjny może nie obsługiwać wielu połączeń.

Pliki binarne MySQL dla Linux/x86 pozwalają mieć do 4096 jednoczesnych połączeń, ale samo kompilowane pliki binarne często mają mniejszy limit.

Ustaw table_cache, aby dopasować liczbę otwartych tabel i jednoczesnych połączeń. Obserwuj wartość open_tables, a jeśli szybko rośnie, będziesz musiał zwiększyć jej rozmiar.

Uwaga:

Dwa poprzednie parametry mogą wymagać wielu otwartych plików. 20+max_connections+table_cache*2 to dobre oszacowanie tego, czego potrzebujesz. MySQL w systemie Linux ma opcję open_file_limit, ustaw ten limit.

Jeśli masz złożone zapytania, sort_buffer_size i tmp_table_size będą prawdopodobnie bardzo ważne. Wartości będą zależeć od złożoności zapytania i dostępnych zasobów, ale zalecanymi punktami początkowymi są odpowiednio 4 Mb i 32 Mb.

Uwaga:Są to wartości „na połączenie”, wśród read_buffer_size, read_rnd_buffer_size i kilka innych, co oznacza, że ​​ta wartość może być potrzebna dla każdego połączenia. Dlatego podczas ustawiania tych parametrów weź pod uwagę obciążenie i dostępne zasoby. Na przykład sort_buffer_size jest przydzielany tylko wtedy, gdy MySQL musi wykonać sortowanie. Uwaga:uważaj, aby nie zabrakło pamięci.

Jeśli masz nawiązanych 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ększaj wartość, aż utworzone threads_created nie będą rosły bardzo szybko.

KLUCZ PODSTAWOWY:

W jednej tabeli może być tylko jedna kolumna AUTO_INCREMENT, musi być ona indeksowana i nie może mieć wartości DOMYŚLNEJ

KLUCZ jest zwykle synonimem INDEKSU. Atrybut klucza PRIMARY KEY może być również określony jako po prostu KEY, gdy jest podany w definicji kolumny. Zostało to zaimplementowane w celu zapewnienia zgodności z innymi systemami baz danych.

KLUCZ PODSTAWOWY to unikalny indeks, w którym wszystkie kolumny kluczy muszą być zdefiniowane jako NOT NULL

Jeśli indeks PRIMARY KEY lub UNIQUE składa się tylko z jednej kolumny o typie całkowitym, możesz również odnieść się do kolumny jako „_rowid” w instrukcjach SELECT.

W MySQL nazwa klucza PRIMARY to PRIMARY

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

Zwykle tworzysz wszystkie potrzebne indeksy podczas tworzenia tabel. Każda kolumna zadeklarowana jako PRIMARY KEY, KEY, UNIQUE lub INDEX zostanie zaindeksowana.

NULL oznacza „brak wartości”. Aby przetestować NULL, nie możesz użyj operatorów porównania arytmetycznego, takich jak =, . Zamiast tego użyj operatorów IS NULL i IS NOT NULL:

NO_AUTO_VALUE_ON_ZERO wstrzymuje autoinkrementację dla 0, tak że tylko NULL generuje następny numer sekwencji. Ten tryb może być przydatny, jeśli w kolumnie AUTO_INCREMENT tabeli jest przechowywane 0. (Nawiasem mówiąc, przechowywanie 0 nie jest zalecaną praktyką.)

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

ALTER TABLE mytable AUTO_INCREMENT = value; 

lubSET INSERT_ID =wartość;

O ile nie określono inaczej, wartość rozpocznie się od:1000000 lub określ w następujący sposób:

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

ZNACZNIKI CZASU:

Wartości w kolumnach TIMESTAMP są konwertowane z bieżącej strefy czasowej na UTC w celu przechowywania oraz z UTC do bieżącej strefy czasowej w celu pobrania.

http://dev.mysql.com/doc/refman/5.1 /pl/znacznik czasu.html W przypadku jednej kolumny TIMESTAMP w tabeli możesz przypisać bieżący znacznik czasu jako wartość domyślną i wartość automatycznej aktualizacji.

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

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 skonwertujesz datę i godzinę na uniksowy znacznik czasu w MySQL:
A następnie dodasz do tego 24 godziny:
A następnie przekonwertujesz z powrotem na datę i godzinę, magicznie traci się godzinę!

Oto, co się dzieje. Podczas konwertowania uniksowego znacznika czasu z powrotem na datę i godzinę, brana jest pod uwagę strefa czasowa i tak się składa, że ​​między 28 a 29 października 2006 r. przestawiliś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 bieżącej strefie czasowej połączenia , który jest dostępny jako wartość zmiennej systemowej time_zone. Ponadto UNIX_TIMESTAMP() zakłada, że ​​jej argumentem jest wartość daty i czasu 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 DATE, TIME lub DATETIME.

UWAGA:TYLKO PRZY AKTUALIZACJI aktualizuje DateTime, jeśli pole zostanie zmienione. Jeśli UPDATE nie spowoduje zmiany żadnych pól, to DateTime NIE jest aktualizowany!

Dodatkowo Pierwszy ZNACZNIK CZASU to zawsze domyślnie AUTOUPDATE, nawet jeśli nie został określony

Pracując z Dates, prawie zawsze zwracam się do Julian Date, ponieważ matematyka danych jest wtedy prostą sprawą dodawania lub odejmowania liczb całkowitych i sekund od północy z tego samego powodu. Rzadko kiedy potrzebuję czasu na drobniejszą ziarnistość niż sekundy.

Oba mogą być przechowywane jako 4 bajtowe liczby całkowite, a jeśli przestrzeń jest naprawdę mała, można je połączyć w czas UNIX (sekundy od epoki 01.01.2070) jako liczbę całkowitą bez znaku, która będzie dobra do około 2106 jako:

s w ciągu 24 godzin =86400

' Signed Integer max val =2.147.483.647 - może pomieścić 68 lat w sekundach

' 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 i zwracanie wartości danych niebędących ciągami w natywnym formacie bez konwersji do i z formatu ciągu. (Bardzo przydatne)

Poza tym mysql_real_query() jest szybsze niż mysql_query(), ponieważ nie wywołuje funkcji strlen(), aby operować na ciągu 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 formacie natywnym. Protokół binarny przeszedł sporo zmian we wcześniejszych wydaniach MySQL 4.1.

Możesz użyć makra IS_NUM(), aby sprawdzić, czy pole ma typ liczbowy. Przekaż wartość typu do IS_NUM() i otrzyma wartość TRUE, jeśli pole jest liczbowe:

Należy zauważyć, że dane binarne MOŻE być wysyłane wewnątrz zwykłego zapytania, jeśli je zmienisz i pamiętasz, że MySQL wymaga tylko ten ukośnik odwrotny i znak cudzysłowu muszą zostać zmienione. Jest to więc naprawdę łatwy sposób na WSTAWIANIE krótszych ciągów binarnych, takich jak na przykład zaszyfrowane/solone hasła.

Serwer główny:

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

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

PRZYZNAJ REPLIKACJĘ NA . do slave_user IDENTYFIKOWANE 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 brzmieć:

http://dev.mysql.com/doc/refman /5.0/pl/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 /pl/mysqlbinlog.html

http://dev.mysql.com/doc/refman /5.0/pl/binary-log.html

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

Możesz usunąć wszystkie binarne pliki dziennika za pomocą instrukcji RESET MASTER lub ich podzbiór za pomocą polecenia 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/fid10666379322B54AD41AEB0E4100D878C>

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

Typy danych:

http://dev.mysql.com/doc/refman /5.1/pl/magazyn-wymagania.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 na mieszanym stole z CHAR i VARCHAR, mySQL zmieni CHAR na VARCHAR

RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT, KLUCZ PODSTAWOWY (RecNum)

MySQL zawsze przedstawia daty z pierwszym rokiem, zgodnie ze standardową specyfikacją SQL i ISO 8601

Różne:

Wyłączenie niektórych funkcji MySQL spowoduje zmniejszenie plików danych i szybszy dostęp. Na przykład:

--datadir określi katalog danych i

--skip-innodb wyłączy opcję inno i zaoszczędzi 10-20M

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

Pobierz rozdział 7 — za darmo

InnoDB jest transakcyjny, ale wiąże się z tym obciążenie wydajnościowe. Stwierdziłem, że tabele MyISAM są wystarczające dla 90% moich projektów.Tabele, które nie są bezpieczne dla transakcji (MyISAM) mają kilka własnych zalet, z których wszystkie występują, ponieważ:

nie ma narzutu na transakcję:

Dużo szybciej

Niższe wymagania dotyczące miejsca na dysku

Do wykonania aktualizacji wymagana jest mniejsza ilość pamięci

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. Plik .frm przechowuje format tabeli. Plik danych ma rozszerzenie .MYD (MYData). Plik indeksu ma rozszerzenie .MYI (MYIndex).

Te pliki mogą być kopiowane do miejsca przechowywania w stanie nienaruszonym bez korzystania z funkcji MySQL Administrators Backup, która jest czasochłonna (tak samo jak Przywracanie)

Sztuczka polega na zrobieniu kopii tych plików, a następnie opuszczeniu tabeli. Po umieszczeniu plików backMySQl 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 podstawowych w każdej tabeli. Możesz znacznie przyspieszyć ten proces, modyfikując oryginalny plik zrzutu, otaczając go następującymi elementami:

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ładowywania, dodaj polecenie SQL SET AUTOCOMMIT =0; na początku pliku zrzutu i dodaj COMMIT; polecenie do końca.

Domyślnie automatyczne zatwierdzanie jest włączone, co oznacza, że ​​każde polecenie wstawiania w pliku zrzutu będzie traktowane jako oddzielna transakcja i zapisywane na dysku przed uruchomieniem następnej. Jeśli nie dodasz tych poleceń, przeładowanie dużej bazy danych do InnoDB może zająć wiele godzin...

Maksymalny rozmiar wiersza w tabeli MySQL to 65 535 bajtów

Efektywna maksymalna długość VARCHAR w MySQL 5.0.3 i dalej =maksymalny rozmiar wiersza (65 535 bajtów)

Wartości VARCHAR nie są dopełniane podczas ich przechowywania. 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 spacje.

Użycie CHAR przyspieszy dostęp tylko wtedy, gdy cały rekord ma stały rozmiar. Oznacza to, że jeśli używasz dowolnego obiektu o zmiennym rozmiarze, równie dobrze możesz zmienić jego rozmiar. Nie zyskujesz szybkości, używając ZNAKU w tabeli, która również zawiera VARCHAR.

Limit VARCHAR wynoszący 255 znaków został podniesiony do 65535 znaków w MySQL 5.0.3

Wyszukiwanie pełnotekstowe jest obsługiwane tylko w przypadku tabel MyISAM.

http://dev.mysql.com/doc/refman /5.0/pl/wyszukiwanie-pełnotekstowe.html

Kolumny BLOB nie mają zestawu znaków, a sortowanie i porównywanie opiera się na wartościach liczbowych bajtów w wartościach kolumn

Jeśli ścisły tryb SQL nie jest włączony i przypiszesz wartość do kolumny BLOB lub TEXT, która przekracza maksymalną długość kolumny, wartość jest obcinana, aby zmieścić się i generowane jest ostrzeżenie.

Przydatne polecenia:

sprawdź tryb ścisły:SELECT @@global.sql_mode;

wyłącz tryb ścisły:

SET @@global.sql_mode='';

SET @@global.sql_mode='MYSQL40'

lub usuń:sql-mode="STRICT_TRANS_TABLES,...

POKAŻ KOLUMNY Z mytable

SELECT max(namecount) AS 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 do bieżącego wątku max(pkcolname) pobiera łącznie ostatnie PK.

Uwaga:jeśli tabela jest pusta, max(pkcolname) zwraca 1 mysql_insert_id() konwertuje typ zwracany przez natywną funkcję MySQL C API mysql_insert_id() na typ oflong (o nazwie int w PHP).

Jeśli kolumna AUTO_INCREMENT ma typ kolumny BIGINT, wartość zwracana przez mysql_insert_id() będzie niepoprawna. 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

Pamiętaj tylko, że gdy próbujesz wstawić dane do tabeli i pojawia się błąd:

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

używając czegoś takiego jak

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

to dlatego, że nie ma żadnych apostrofów wokół wartości, które próbujesz wkleić do tabeli. Powinieneś więc zmienić swój kod na:

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

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

Utracono połączenie z serwerem podczas zapytania:

http://dev.mysql.com/doc/refman /5.1/pl/gone-away.html

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

http://dev.mysql.com/doc/refman /5.0/pl/parametry-serwera.html

http://dev.mysql.com/doc/refman /5.1/pl/show-variables.html

http://dev.mysql.com/doc/refman /5.1/pl/pliki-opcji.html

http://dev.mysql.com/doc/refman /5.1/pl/log-błędów.html

Zapytania dotyczące strojenia

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

Cóż, myślę, że to powinno wystarczyć, aby zdobyć bonus... Owoce wielu godzin i wielu projektów ze świetnym darmowym Baza danych. Tworzę serwery danych aplikacji na platformach Windows głównie z użyciem MySQL. Najgorszy bałagan, jaki musiałem wyprostować, to

Ostateczny koszmar dotyczący starszych baz danych MySQL

Wymagało to szeregu aplikacji, aby przetworzyć tabele w coś użytecznego przy użyciu wielu wymienionych tutaj sztuczek.

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

Sprawdź również moje inne artykuły i białe księgi na:www.coastrd.com



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie danych blob w Javie za pomocą PreparedStatement

  2. Jaki jest najlepszy algorytm wyszukiwania dla PHP i MYSQL?

  3. Wstawianie elementów do bootstrap-dropdown z SQL Table

  4. Wspólne filtrowanie w MySQL?

  5. Jak mogę sprawdzić, czy istnieje tabela MySQL z PHP?