Moja aplikacja wymaga dużej bazy danych. Obecnie korzystam z MySQL 5.5.19 i korzystam z MyISAM, ale jestem w trakcie migracji do InnoDB. Pozostaje tylko problem z wydajnością sumy kontrolnej.
Moja aplikacja wykonuje CHECKSUM TABLE
w godzinach szczytu około 500–1000 instrukcji na sekundę, ponieważ GUI klienta stale przeszukuje bazę danych pod kątem zmian (jest to system monitorowania, więc musi być bardzo responsywny i szybki).
W MyISAM istnieją sumy kontrolne na żywo, które są wstępnie obliczane przy modyfikacji tabeli i są BARDZO szybkie. Jednak nie ma czegoś takiego w InnoDB. Jest więc CHECKSUM TABLE
bardzo powolny.
Mam nadzieję, że będę w stanie sprawdzić czas ostatniej aktualizacji tabeli, niestety nie jest to również dostępne w InnoDB. Utknąłem teraz, ponieważ testy wykazały, że wydajność aplikacji drastycznie spada.
Jest po prostu zbyt wiele wierszy kodu, które aktualizują tabele, więc nie ma mowy o implementacji logiki w aplikacji do rejestrowania zmian w tabeli.
Czy istnieje szybka metoda wykrywania zmian w tabelach InnoDB?
źródło
Myślę, że znalazłem rozwiązanie. Przez jakiś czas patrzyłem na Percona Server, aby wymienić moje serwery MySQL, a teraz myślę, że jest ku temu dobry powód.
Serwer Percona wprowadza wiele nowych tabel INFORMACJE_SCHEMA, takich jak INNODB_TABLE_STATS, które nie są dostępne w standardowym serwerze MySQL. Kiedy to zrobisz:
Otrzymasz rzeczywistą liczbę wierszy i licznik. Oficjalna dokumentacja mówi o tym następujące pola:
Tak więc ten licznik jest zawijany co jakiś czas, ale możesz zrobić sumę kontrolną liczby wierszy i licznika, a następnie przy każdej modyfikacji tabeli otrzymujesz unikalną sumę kontrolną. Na przykład:
W każdym razie zamierzałem zaktualizować swoje serwery do serwera Percona, więc to ograniczenie nie stanowi dla mnie problemu. Zarządzanie setkami wyzwalaczy i dodawanie pól do tabel jest dużym problemem dla tej aplikacji, ponieważ jest bardzo późno w fazie rozwoju.
Oto funkcja PHP, którą wymyśliłem, aby upewnić się, że tabele można sprawdzać niezależnie od używanego silnika i serwera:
Możesz użyć tego w następujący sposób:
Mam nadzieję, że zaoszczędzi to trochę problemów innym osobom mającym ten sam problem.
źródło
W tej wersji powinieneś zaktualizować do MySQL v5.6 +. Innodb obsługuje także tabelę sum kontrolnych. http://dev.mysql.com/doc/refman/5.6/en/checksum-table.html
poza tym idealnym rozwiązaniem byłoby, gdyby Twój klient nie sondował ciągle wyników, ale zamiast tego przesuwałeś nowe i zmienione dane, kiedy i jeśli były dostępne. Byłoby to szybsze i mniej obciążałoby serwer. jeśli używasz GUI przez Internet, powinieneś zajrzeć do APE http://ape-project.org/ lub innych podobnych projektów.
źródło
Jeśli głównie dodajesz do tabeli, możesz podłączyć AUTO_INCREMENT jako miarę aktualizacji.
Ale wolałbym odwoływać się do innego źródła, takiego jak licznik w Memcached, który będzie zwiększany za każdym razem, gdy zmienisz coś w bazie danych.
źródło
Możesz spróbować wykonać następujące czynności:
Zwraca liczbę, która rośnie z każdą aktualizacją tabeli, śledzenie jej pozwoli wykryć zmianę.
Ważna uwaga: wartość zmienia się natychmiast po aktualizacji, a nie po zatwierdzeniu. Dlatego zmiany mogą nie być widoczne, jeśli zmiany zostały wprowadzone w ramach innej transakcji, która się nie zakończyła.
źródło
Ta odpowiedź nie ma nic wspólnego z wersjami lub typami baz danych MySQL, chciałem wiedzieć, czy instrukcje aktualizacji wprowadzają zmiany ORAZ zrobić to w moim kodzie PHP.
Utworzono fikcyjną tabelę z jednym rekordem i jednym polem, które chciałbym zapytać, aby uzyskać wartość parametru current_timestamp mysql.
Do aktualizowanej tabeli danych dodano pole znacznika czasu i użyłem opcji mysql „ON UPDATE CURRENT_TIMESTAMP”
W porównaniu # 1 i # 2
To nie zadziała w 100% przypadków, ale dla mojej aplikacji było to proste i świetne rozwiązanie. Mam nadzieję, że to komuś pomoże
źródło