2013-06-05 14 views
5

Mam problem z powodu pola LONGTEXT. Wszystko działa dobrze, ale kiedy zapytanie SELECT jest wykonywane z dowolną klauzulą ​​WHERE, mysql przechodzi w stan uśpienia i nigdy nie wraca. Jest tylko 80 000 rekordów i wyraźne porównanie WHERE działa dobrze. (Niektóre rekordy są powyżej 1M, kilka ma około 700K, a reszta to tylko 60 do 100KB).Pole MySQL - LONGTEXT zawiesza się w instrukcji SELECT-WHERE

Na przykład:

[HANGs] 
SELECT * FROM item_info 
WHERE added_on > '2013-02-14 19:40:05' AND added_on < '2013-02-15 19:40:05'  
;which is like 2 rows only 

[FINE] 
SELECT * from item_info 
WHERE item_id in (1, 10, 1000) 

Czy to zwykłe zachowanie?

Oto schemat:

CREATE TABLE `item_info` (
    `item_id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title_md5` varchar(35) NOT NULL, 
    `original_document` longtext NOT NULL, 
    `added_on` datetime NOT NULL, 
    PRIMARY KEY (`item_id`), 
    UNIQUE KEY `md5_Unique` (`title_md5`) 
) ENGINE=MyISAM AUTO_INCREMENT=87781 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC; 

Czy istnieje rozwiązanie? Czy muszę oddzielić pole longtextu od nowej tabeli za pomocą klucza obcego?

+0

to nie ma nic wspólnego z "długimi literami" porównywanie dat może być kosztowne. –

+0

@ DanielA.White w rzeczywistości, ale w tym przypadku jest tylko 88k rekordów – Stephan

+0

Brzmi jak problem z blokowaniem. Gdzie wykonujesz zapytanie? Z języka lub z wiersza poleceń SQL? Wątpię, żeby miało to coś wspólnego z LONGTEXT lub porównaniem dat. –

Odpowiedz

0

Brzmi prosto, ale jeśli to możliwe, uaktualnij wersję MySQL, spróbuj zwiększyć limit pamięci i maksymalny czas wykonania.

5

Używasz tabel MyISAM. Jest na nich ograniczenie, które nie jest obecne na InnoDB;

MyISAM zawsze odczytuje pełny wiersz z dysku, nawet jeśli niektóre pola nie są testowane w SELECT.

Schemat wygląda tak, jakby mieć indeks na item_id, ale nie na added_on.

Ponieważ nie masz indeksu na added_on, zapytanie wygeneruje pełne skanowanie tabeli. Pełne skanowanie tabeli na stoliku MyISAM z długimi wierszami będzie wymagało odczytania danych z dysku z część.

Dodanie indeksu na added_on przyspieszy twoje zapytanie w górę, ponieważ będziesz musiał tylko odczytać wiersze tabeli faktycznie potrzebne.

+0

to nie tylko dodano, istnieją inne proste pola, a wynik jest taki sam wolny ... –

+0

czy sugerujesz, że powinienem zmienić to na 'InnoDB'? –

+0

Myślałem, że 'InnoDB' był specjalistą od' transakcji kwasowej'; ale po prostu w jeden sposób przeczytany, "MyISAM" był najlepszy ... –