[MySQL] Index wordt niet gebruikt?

Pagina: 1
Acties:
  • 391 views sinds 30-01-2008
  • Reageer

  • Navi
  • Registratie: Maart 2007
  • Niet online
Deze query wordt bij het aanroepen van mijn voorpagina 2 maal uitgevoerd en volgens mij zorgt die ervoor dat het behoorlijk traag is, omdat het een hele grote tabel met veel records helemaal na moet lopen.

Nu wilde ik hier voor een INDEX aanmaken, alleen om 1 of andere reden gebruikt hij hem niet, dit is de query:

SQL:
1
2
3
4
5
6
7
8
9
10
11
# Query_time: 0  Lock_time: 0  Rows_sent: 1  Rows_examined: 22232
EXPLAIN ANALYZE SELECT COUNT(DISTINCT(tt_news.uid))
FROM tt_news
LEFT JOIN tt_news_cat_mm ON tt_news.uid = tt_news_cat_mm.uid_local
WHERE hidden != 1 
AND deleted != 1 
AND tt_news.pid IN (448,75, heel erg veel nummers hier, 3443, 1242)
AND 1=1 
AND tt_news.sys_language_uid IN (0,-1) 
AND (tt_news.archivedate=0 OR tt_news.archivedate>1195126294) 
AND (IFNULL(tt_news_cat_mm.uid_foreign,0) IN (1000000038,1000000323,1000000333,1000000047,1000000312));


Als ik hier een EXPLAIN van draai:

code:
1
2
3
4
5
6
+----+-------------+----------------+------+-----------------------------------------------+--------------------+---------+-----------------------+------+--------------------------+
| id | select_type | table          | type | possible_keys                                 | key                | key_len | ref                   | rows | Extra                    |
+----+-------------+----------------+------+-----------------------------------------------+--------------------+---------+-----------------------+------+--------------------------+
|  1 | SIMPLE      | tt_news        | ALL  | parent,deleted,hidden,IDX_TTNEWS1,IDX_TTNEWS2 | NULL               | NULL    | NULL                  | 9988 | Using where              |
|  1 | SIMPLE      | tt_news_cat_mm | ref  | uid_local,IDX_TTNEWS_CAT_MM1                  | IDX_TTNEWS_CAT_MM1 | 4       | livetypo3.tt_news.uid |    2 | Using where; Using index |
+----+-------------+----------------+------+-----------------------------------------------+--------------------+---------+-----------------------+------+--------------------------+


Hij ziet wel de possible keys, maar hij gebruikt ze niet, weet iemand waarom dit zo is?

Mijn indexen zien er zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tt_news tabel:
Sleutel naam Type Kardinaliteit Actie Veld 
PRIMARY  PRIMARY  9988       uid  
parent  INDEX  277       pid  
t3ver_oid  INDEX  1       t3ver_oid  
t3ver_wsid  
deleted  INDEX  2       deleted  
hidden  INDEX  2       hidden  
IDX_TTNEWS1  INDEX  5       sys_language_uid  
IDX_TTNEWS2  INDEX  3       archivedate


tt_news_cat_mm
Sleutel naam Type Kardinaliteit Actie Veld 
uid_local  INDEX  7494       uid_local  
uid_foreign  INDEX  299       uid_foreign  
IDX_TTNEWS_CAT_MM1  INDEX  14988       uid_local  
uid_foreign

Meer dan 1 INDEX sleutel was gecreëerd voor de kolom `uid_local`


zoals je ziet die 2e index wordt wel gebruikt, alleen de andere gebeurt niets mee.

Googlen leverd weinig op aangezien die vaak alleen uitleggen wat indexen zijn en hoe ze aan te maken, waar ik wel achter kwam is dat hoe de query nu is, hij heel erg slecht voor de performance is.

Ik heb al geprobeerd alle velden in 1 grote index te zetten of alle velden in zijn eigen aparte index, maar het blifjt hetzelfde, zo te zien gebruikt hij ze niet..

Iemand een idee?

[ Voor 2% gewijzigd door een moderator op 15-11-2007 13:03 . Reden: Code tags toegevoegd ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je code post, gebruik dan code tags ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Blijkbaar is MySQL van mening dat de query sneller uitgevoerd kan worden zonder index. Weet je zeker dat MySQL ongelijk heeft? Dan kan je het gebruik van een index forceren met FORCE INDEX.

Wie trösten wir uns, die Mörder aller Mörder?


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Index op bit velden is nutteloos tenzij je ze dwingt te gebruiken.
You are using a key with low cardinality (many rows match the key value) through another column. In this case, MySQL assumes that by using the key it probably will do many key lookups and that a table scan would be faster.
http://dev.mysql.com/doc/...-to-avoid-table-scan.html

Dus hidden en deleted kunnen weg als index of moeten gedwongen worden!

Hoeveel nummer probeer je te matchen met pid?

[ Voor 5% gewijzigd door LuCarD op 15-11-2007 13:42 ]

Programmer - an organism that turns coffee into software.