Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z zapytaniem i użyciem kluczy
ChrisB
post 20.05.2010, 15:08:26
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


witam
zauważyłem jakiś czas temu u siebie dużą wielkość Handler_read_rnd_next, po około godzinie pracy serwera: 2 530 k

i teraz, włączyłem logowanie do pliku zapytań nie wykorzystujących poprawnie indexów, z bardziej rażących przykładów:

tabela ranking:

  1. CREATE TABLE `ranking` (
  2. `id_uzyt` mediumint(7) NOT NULL DEFAULT '0',
  3. `grupa` smallint(6) NOT NULL DEFAULT '0',
  4. `data` date DEFAULT NULL,
  5. `wartosc_portfela` double(13,2) NOT NULL DEFAULT '0.00',
  6. `miejsce` smallint(6) NOT NULL DEFAULT '0',
  7. `miejscepop` smallint(6) NOT NULL DEFAULT '0',
  8. `login` char(20) collate utf8_polish_ci NOT NULL DEFAULT '',
  9. `procentinv` float(4,2) NOT NULL DEFAULT '0.00',
  10. `zmianawart1` float(6,2) NOT NULL DEFAULT '0.00',
  11. `zmianawart2` float(6,2) NOT NULL DEFAULT '0.00',
  12. `miejscetydz` mediumint(9) NOT NULL,
  13. `zmianawart3` float(6,2) NOT NULL DEFAULT '0.00',
  14. `miejscemies` mediumint(9) NOT NULL,
  15. KEY `miejsce` (`miejsce`),
  16. KEY `id_uzyt` (`id_uzyt`),
  17. KEY `grupa` (`grupa`)
  18. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;



zapytanie:

  1. mysql> explain select * from ranking order by miejsce ASC limit 8300,100;
  2. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------+
  3. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  4. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------+
  5. | 1 | SIMPLE | ranking | index | NULL | miejsce | 2 | NULL | 8472 | |
  6. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------+
  7. 1 row in set (0.00 sec)


całkowita liczba rekordów 8472 - skanuje je wszystkie by podać mi wynik

i teraz pytanie brzmi co robię źle?
byłbym wdzięczny za jakieś wskazówki
pozdrawiam


--------------------
gragieldowa.pl
Go to the top of the page
+Quote Post
Mchl
post 20.05.2010, 15:21:47
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Nic. Nie ma innej możliwości posortowania wszystkich wierszy w tabeli jak tylko przez posortowanie wszystkich wierszy w tabeli.

Poza tym zauważ, że zapytanie wykorzystuje indeks `miejsce`
Go to the top of the page
+Quote Post
wookieb
post 20.05.2010, 15:30:20
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A co długo się wykonuje? Nie zapytanie nie wykorzystuje do końca indeksu.

  1. EXPLAIN SELECT * FROM tabela ORDER BY miejsce ASC

To wykorzysta index pod warunkiem, że będzie na tym polu założony
  1. EXPLAIN SELECT miejsce FROM tabela ORDER BY miejsce ASC


Ten post edytował wookieb 20.05.2010, 15:31:22


--------------------
Go to the top of the page
+Quote Post
ChrisB
post 20.05.2010, 15:38:00
Post #4





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


nie, nie wykonuje się długo, ale za to często, i wylądowało w logu powolnych zapytań i tych które nieprawidłowo używają kluczy (robią full table scan)
łącznie serwer zaczyna przymulać, i ta wartość Handler_read_rnd_next rośnie szybko (gdzie powinna być naprawde niska)

w każdym razie teraz inny przykład:

  1. # Query_time: 0 Lock_time: 0 Rows_sent: 449 Rows_examined: 950
  2. select id_not,krotka,kurs,ostzamkniecie,volumen from notowania where branza>0 order by krotka;
  3.  


  1. mysql> SHOW INDEX FROM notowania;
  2. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  3. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
  4. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  5. | notowania | 0 | PRIMARY | 1 | id_not | A | 501 | NULL | NULL | | BTREE | |
  6. | notowania | 0 | KROTKA | 1 | krotka | A | 501 | NULL | NULL | | BTREE | |
  7. | notowania | 1 | branza | 1 | branza | A | 5 | NULL | NULL | | BTREE | |
  8. | notowania | 1 | nazwa_akcji | 1 | nazwa_akcji | A | 501 | NULL | NULL | | BTREE | |
  9. | notowania | 1 | zmiana | 1 | zmiana | A | 250 | NULL | NULL | | BTREE | |
  10. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+



wysłało 449, zbadało 950 - przy łącznej ilości rekordów - 501 w bazie

i jeszcze explain:
  1. mysql> explain extended select id_not,krotka,kurs,ostzamkniecie,volumen from notowania where branza>0 order by krotka;
  2. +----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------+
  3. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  4. +----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------+
  5. | 1 | SIMPLE | notowania | ALL | branza | NULL | NULL | NULL | 501 | Using where; Using filesort |
  6. +----+-------------+-----------+------+---------------+------+---------+------+------+-----------------------------+
  7. 1 row in set, 1 warning (0.00 sec)



--------------------
gragieldowa.pl
Go to the top of the page
+Quote Post
Mchl
post 20.05.2010, 16:22:10
Post #5





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Cytat(wookieb @ 20.05.2010, 16:30:20 ) *
A co długo się wykonuje? Nie zapytanie nie wykorzystuje do końca indeksu.

  1. EXPLAIN SELECT * FROM tabela ORDER BY miejsce ASC

To wykorzysta index pod warunkiem, że będzie na tym polu założony
  1. EXPLAIN SELECT miejsce FROM tabela ORDER BY miejsce ASC


A dokąd go wykorzystuje jak nie do końca?

select_type - SIMPLE (Simple SELECT)
type - index (This join type is the same as ALL, except that only the index tree is scanned. This usually is faster than ALL because the index file usually is smaller than the data file. )
key - miejsce
key_len - 2

Zmiana powyżej miałaby sens na silniku InnoDB [dodane] No dobra. W MyISAM też, jeśli rzeczywiście potrzebna jest tylko ta jedna kolumna.


Kod
select id_not,krotka,kurs,ostzamkniecie,volumen from notowania where branza>0 order by krotka;

Spróbuj założyć indeks na kolumny (branza,krotka)

Ten post edytował Mchl 20.05.2010, 16:33:48
Go to the top of the page
+Quote Post
ChrisB
post 20.05.2010, 16:39:02
Post #6





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


wposcie powyżej wypisałem indeksy z tabeli
id_not, krotka, branza, nazwa_akcji, zmiana - mają nałożone indeksy
tabela ma ponad 80 kolumn więc strukture sobie podaruje


--------------------
gragieldowa.pl
Go to the top of the page
+Quote Post
Mchl
post 20.05.2010, 16:45:08
Post #7





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Ale nie ma tam indeksu obejmującego obie te kolumny.
http://dev.mysql.com/doc/refman/5.0/en/mul...mn-indexes.html
Go to the top of the page
+Quote Post
ChrisB
post 20.05.2010, 16:57:16
Post #8





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


człowiek uczy się czegoś co chwilę, nawet nie wiedziałem że tak można:P
w każdym razie:


  1. +----+-------------+-----------+------+-----------------+------+---------+------+------+-----------------------------+
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  3. +----+-------------+-----------+------+-----------------+------+---------+------+------+-----------------------------+
  4. | 1 | SIMPLE | notowania | ALL | branza,branza_2 | NULL | NULL | NULL | 501 | Using where; Using filesort |
  5. +----+-------------+-----------+------+-----------------+------+---------+------+------+-----------------------------+



  1. mysql> SHOW INDEX FROM notowania;
  2. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  3. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
  4. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
  5. | notowania | 0 | PRIMARY | 1 | id_not | A | 501 | NULL | NULL | | BTREE | |
  6. | notowania | 0 | KROTKA | 1 | krotka | A | 501 | NULL | NULL | | BTREE | |
  7. | notowania | 1 | branza | 1 | branza | A | 5 | NULL | NULL | | BTREE | |
  8. | notowania | 1 | nazwa_akcji | 1 | nazwa_akcji | A | 501 | NULL | NULL | | BTREE | |
  9. | notowania | 1 | zmiana | 1 | zmiana | A | 250 | NULL | NULL | | BTREE | |
  10. | notowania | 1 | branza_2 | 1 | branza | A | 5 | NULL | NULL | | BTREE | |
  11. | notowania | 1 | branza_2 | 2 | krotka | A | 501 | NULL | NULL | | BTREE | |
  12. +-----------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+


chyba dalej coś do końca nie jest tak jak powinno


--------------------
gragieldowa.pl
Go to the top of the page
+Quote Post
wookieb
post 20.05.2010, 17:15:41
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zeby w tym zapytaniu był użyty tylko indeks, musisz mieć założone indeksy na wszystkie kolumny które pobierasz, filtrujesz i sortujesz.
Ale to raczej nie na tym polega...
To że wykonują się często to jedna sprawa, na twoim miejscu pomyślałbym po prostu o cache po stronie php.

Ten post edytował wookieb 20.05.2010, 17:20:48


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 13:14