MySQL: počasen NOT IN query
 
SlimDeluxe 12. okt 2010 08:18:25 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#1

Zdravo,

imam dve tabeli.

Product

in

visitstat


SELECT id, name FROM Product ORDER BY name ASC LIMIT 100

100 rows in set (0.05 sec)


SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02'

9 rows in set (0.08 sec)


SELECT id, name FROM Product WHERE id NOT IN (SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02') ORDER BY name ASC LIMIT 100

100 rows in set (4 min 15.10 sec)



Ve kdo, v čem bi lahko bil problem?


všeč(0) ni všeč(0) spam(0)
Freelance Web Developer
 
Vini 12. okt 2010 08:38:38 Pridružen od:
1. sep 2006
6612 objav
5234 611 56
#2

Daj, pripopaj še EXPLAIN.


všeč(0) ni všeč(0) spam(0)
 
bl4ckb1rd 12. okt 2010 08:52:33 Pridružen od:
18. avg 2008
1122 objav
750 91 11
#3

brez explaina ne boš prišel do dna zadevi, drugače pa... distinct zna bit problem... koliko imaš vseh vrstic v teh 2 tabelah, očitno precej...


všeč(0) ni všeč(0) spam(0)
blackbird.si - Moj plac za odlaganje problemov in rešitev...
 
SlimDeluxe 12. okt 2010 08:58:05 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#4
+----+--------------------+-----------+------+---------------+------+---------+------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-----------+------+---------------+------+---------+------+-------+------------------------------+
| 1 | PRIMARY | Product | ALL | NULL | NULL | NULL | NULL | 1519 | Using where; Using filesort |
| 2 | DEPENDENT SUBQUERY | visitstat | ALL | NULL | NULL | NULL | NULL | 25947 | Using where; Using temporary |
+----+--------------------+-----------+------+---------------+------+---------+------+-------+------------------------------+

Product count: 1519

Visitstat count: 25947


všeč(0) ni všeč(0) spam(0)
Freelance Web Developer
 
Roky 12. okt 2010 09:09:48 Pridružen od:
9. apr 2008
2506 objav
3240 335 107
#5

Poglej possible_keys, je prazen. Imaš indexe na visitstat?


všeč(0) ni všeč(0) spam(0)
rok.meglic@gmail.com - 031 492 148
 
SlimDeluxe 12. okt 2010 09:21:42 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#6

Ni indexa :)

DB model je star, vse je MyISAM, tabele nimajo primarnih ključev, indeksov...


všeč(0) ni všeč(0) spam(0)
Freelance Web Developer
 
Roky 12. okt 2010 09:24:17 Pridružen od:
9. apr 2008
2506 objav
3240 335 107
#7

Pol si si odgovoril na vprašanje zakaj toliko časa rabi:)


všeč(0) ni všeč(0) spam(0)
rok.meglic@gmail.com - 031 492 148
 
SlimDeluxe 12. okt 2010 09:44:53 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#8

Nope ne pomaga :)

100 rows in set (4 min 9.50 sec)


mysql> show indexes from visitstat;
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| visitstat | 0 | PRIMARY | 1 | id | A | 25947 | NULL | NULL | | BTREE | |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

Bi moral še kaj glede indexa popraviti?



Explain pa še vedno kaže isto zadevo kot zgoraj.


všeč(0) ni všeč(0) spam(0)
Freelance Web Developer
 
ledi 12. okt 2010 13:08:15 Pridružen od:
14. avg 2008
681 objav
325 223 14
#9

name tudi rabi index če delaš sort na njem


všeč(0) ni všeč(0) spam(0)
 
blackmamba 12. okt 2010 15:07:39 Pridružen od:
4. mar 2008
559 objav
392 25 11
#10

Letos so na PHPkonferenci povedali, da se včasih splača zadevo naredit v 2 korakih.



In sicer, najprej

SELECT DISTINCT refId FROM visitstat WHERE type='P' AND date > '2010-10-02'

rezultate lepo spravit v string ločen z vejicami,

v 2. koraku pa

SELECT id, name FROM Product WHERE id NOT IN (23,45,67,...)

Tukaj moraš pazit, da dolžina queirja ne preseže 'maxallowedpacket'



Drugače pa malo experimentiraj z indexi. (indexe na tisto po čemer sortiraš, tisto kar selectaš).



Tabele lahko probaš spremenit v innodb, da vidiš če kaj profitiraš...


všeč(1) ni všeč(0) spam(0)
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se