Muszę sprawdzić plan zapytania dla następującego zapytania w MySQL za pomocą EXPLAIN.

Problemem jest jednak kolumna w klauzuli where jest binarna(16). To przewodnik.

explain select `title`,`ttext` 
FROM ptip inner join user on user.id = ptip.userId
where ptip.titlehash = <whatever value>

Tutaj tytuł hash jest binarny(16), a zapytanie daje następujący błąd:

„Niemożliwe GDZIE zauważyłem po przeczytaniu tabel const”

Próbowałem używać; gdzie ptip.titlehash = BINARY('24dwdfsdf'), ale nadal to samo;

Jak uruchomić powyższe zapytanie?

0
Amila 12 czerwiec 2011, 23:30

2 odpowiedzi

Najlepsza odpowiedź

Ok, oto jak w końcu to rozwiązałem;

SET @hs = (SELECT titlehash FROM ptip WHERE id = 5673);
EXPLAIN SELECT `title`,`ttext` 
FROM ptip INNER JOIN USER ON user.id = ptip.userId
WHERE ptip.titlehash  = @hs

Umieszczam wartość w zmiennej @hs, a następnie używam do wyjaśnienia. Na szczęście polecenie wyjaśniania wyjaśnia tylko wybór. Nie dba o operację SET i traktuje zmienną @hs tylko jako wartość

1
Amila 15 czerwiec 2011, 22:23

Niemożliwe GDZIE zauważyłem po przeczytaniu tabel const

Co to oznacza:
Const tables oznacza, że ​​MySQL zauważył, że tylko jeden wiersz może pasować na złączeniu. Zamiast tego, czytając to w zapytaniu, przechowuje ten wiersz w const table

Zgodnie z instrukcją MySQL:

Tabela zawiera co najwyżej jeden pasujący wiersz, który jest odczytywany na początku zapytania. Ponieważ istnieje tylko jeden wiersz, wartości z kolumny w tym wierszu mogą być traktowane przez resztę optymalizatora jako stałe. tabele const są bardzo szybkie, ponieważ są odczytywane tylko raz.

Problem
Problem, który ty masz tutaj, polega na tym, że MySQL zauważył, że w twoim sprzężeniu nie ma pasujących wierszy. Z tego powodu MySQL nie może odczytać wiersza z tabeli const i nie może rozpocząć zapytania.

Rozwiązanie
Napraw zapytanie, czy nie zwraca pustego zestawu wyników i ponownie uruchom wyjaśnienie.

0
Johan 12 czerwiec 2011, 23:40
Tak; problemem jest umieszczenie wartości w klauzuli where. Kolumna użyta w klauzuli WHERE (titlehash) to BINARY(16), która w rzeczywistości zawiera identyfikator GUID. Kiedy uruchamiam wybór na tym, pokazuje dane jako blob, ale nic więcej. Jak więc umieścić wartość w klauzuli where? Na serwerze sql pokazuje guidy w formacie xxxx-xxx-xxx.. ale w tym mysql nie pokazuje rzeczywistych znaków
 – 
Amila
13 czerwiec 2011, 09:12