Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tabela z dwoma polami - indexować, czy nie?
Forum PHP.pl > Forum > Bazy danych > MySQL
mkozak
Witam,
Mam taką tabelkę:

  1. CREATE TABLE IF NOT EXISTS `new` (
  2. `co_id` int(8) DEFAULT '0',
  3. `status` tinyint(4) DEFAULT '0',
  4. KEY `statusy` (`status`,`co_id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=1;


Danych jest 12 milionów.
Dane 87 049,5 KB
Indeks 300,0 MB
Sumarycznie 385,0 MB

Dla wszystkich numerków co_id jadę paczkami po 100 (celem rozłożenia danych w innej bazie na kilka tabelek).
W mojej pętli idzie to tak:

  1. do{
  2.  
  3. $sql = "UPDATE new SET status = $status WHERE status = 0 LIMIT 100";
  4.  
  5. if($ile>0){
  6. $sql = "SELECT co_id FROM new WHERE status = $status";
  7. $re = mysql_query($sql);
  8.  
  9. $insert = array();
  10.  
  11. while($t_tmp = mysql_fetch_assoc($re)){
  12. if($t_tmp['co_id'] > 0){
  13. $t_done = insert_him($t_tmp,$status);
  14. if($t_done !== false){
  15. foreach($t_done as $a){
  16. $insert[] = $a;
  17. }
  18. }else{
  19. $sql = "UPDATE new SET status = 102 where co_id = ".$t_tmp['co_id'];
  20. mysql_query($sql);
  21. }
  22. }else{
  23. echo('error: '.$sql_status."\n");
  24. }
  25. }
  26.  
  27. if(count($insert) > 0){
  28. request_insert($insert);
  29. $sql = "UPDATE new SET status = 100 where status = $status";
  30. mysql_query($sql);
  31. }
  32. }
  33.  
  34. if($status == 6){
  35. $status = 7;
  36. }elseif($status == 7){
  37. $status = 8;
  38. }elseif($status == 8){
  39. $status = 9;
  40. }else{
  41. $status = 6;
  42. }
  43.  
  44. $i = $i+1;
  45.  
  46. if($i == 1000){$ile = 0;}
  47.  
  48. }while($ile>0);


O ile w zapytaniach z WHERE po status-ie klucz jest używany, to w tym zapytaniu już nie (mylę się?):

  1. $sql = "UPDATE new SET status = 102 where co_id = ".$t_tmp['co_id'];


W każdym razie. Czy opłaca się to zaindeksować po samym co_id??

Danych jest 80 MB, a indexu będzie kolejne jakieś megabajty. To czy opłaca się mnożyć indexy, czy lepiej niech jedzie full scanem??
michaJlS
Ale w podanym zapytaniu też używasz statusu, a w kluczu `statusy` - status jest pierwszy, więc czemu nie miałby mysql z niego skorzystać? Najlepiej to po prostu zapytaj mysqla http://dev.mysql.com/doc/refman/5.0/en/explain.html
mkozak
Cytat(michaJlS @ 1.09.2010, 20:04:50 ) *
Ale w podanym zapytaniu też używasz statusu, a w kluczu `statusy` - status jest pierwszy, więc czemu nie miałby mysql z niego skorzystać? Najlepiej to po prostu zapytaj mysqla http://dev.mysql.com/doc/refman/5.0/en/explain.html


Explaina z update-a nie zrobię, a jeżeli przeczytasz uważnie to

  1. UPDATE new SET STATUS = 102 WHERE co_id = $co_id


WHERE na jedynie co_id, więc status nie bierze udziału w wyszukiwaniu. Pytanie, czy dołożenie mega indexu zmieni cokolwiek, czy będzie porównywalne z full scanem (skoro i tak struktura jest bardzo uboga)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.