Mam taką tabelkę:
CREATE TABLE IF NOT EXISTS `new` ( `co_id` int(8) DEFAULT '0', `status` tinyint(4) DEFAULT '0', KEY `statusy` (`status`,`co_id`) ) 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:
do{ $sql = "UPDATE new SET status = $status WHERE status = 0 LIMIT 100"; if($ile>0){ $sql = "SELECT co_id FROM new WHERE status = $status"; if($t_tmp['co_id'] > 0){ $t_done = insert_him($t_tmp,$status); if($t_done !== false){ foreach($t_done as $a){ $insert[] = $a; } }else{ $sql = "UPDATE new SET status = 102 where co_id = ".$t_tmp['co_id']; } }else{ } } request_insert($insert); $sql = "UPDATE new SET status = 100 where status = $status"; } } if($status == 6){ $status = 7; }elseif($status == 7){ $status = 8; }elseif($status == 8){ $status = 9; }else{ $status = 6; } $i = $i+1; if($i == 1000){$ile = 0;} }while($ile>0);
O ile w zapytaniach z WHERE po status-ie klucz jest używany, to w tym zapytaniu już nie (mylę się?):
$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??