yeahz Posted January 11, 2011 Report Share Posted January 11, 2011 Kā būtu pareizāk rakstīt: $count = mysql_fetch_assoc(mysql_query("SELECT count(*) AS skaits ...")); $count = $count['skaits']; vai $query = mysql_query("SELECT ..."); $count = mysql_num_rows($query); Quote Link to comment Share on other sites More sharing options...
daGrevis Posted January 11, 2011 Report Share Posted January 11, 2011 $count = mysql_result( mysql_query( SELECT count( id )... ), 0 ); Quote Link to comment Share on other sites More sharing options...
mounkuls Posted January 11, 2011 Report Share Posted January 11, 2011 Ja pareizi atceros, tad MyISAM tabulām count būs ātrāks, nekā ar num rows. Quote Link to comment Share on other sites More sharing options...
Blitz Posted January 11, 2011 Report Share Posted January 11, 2011 count(*) ir ātrāks par count( id ) Quote Link to comment Share on other sites More sharing options...
daGrevis Posted January 11, 2011 Report Share Posted January 11, 2011 No kura laika? Nē, nu ja tiešām tā ir, tad... Pierādi! =P Quote Link to comment Share on other sites More sharing options...
codez Posted January 11, 2011 Report Share Posted January 11, 2011 (edited) http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ Cik es saprotu, tad count(*) skaita visus ierakstus, taču count(lauks) skaita tos ierakstus, kuros lauks nav NULL. Līdz ar to otrajā gadījumā ir jāpiekļūst datiem, lai pāarbaudītu vai tie nav NULL, līdz ar to count(lauks) ir lēnāks nekā count(*) Edited January 11, 2011 by codez Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted January 11, 2011 Report Share Posted January 11, 2011 (edited) id parasti ir primārā atslēga, tātad tas nevar būt NULL. IMO * vs id (vai jebkurš cits lauks, kas ir primārā atslēga) būs ļoti līdzīga (ja ne tāda pati) ātrdarbībā. Lai vai kā - es to neesmu pārbaudījis. Nedaudz pameklējot, labāk tomēr ir izmantot * (vismaz ja tiek izmantots MyISAM un netiek izmantots WHERE) -> http://dev.mysql.com...#function_count. Tur gan nekas nav minēts par primārajām atslēgām. Pieļauju, ka MySQL to varētu arī nooptimizēt... Edited January 11, 2011 by rATRIJS Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 11, 2011 Report Share Posted January 11, 2011 Nu bet ļaudis - ir taču tāda lieta, kā vaicājuma izpildes plāns, vai ne? Kuru paskatoties nevajag minēt un teoretizēt kā būtu, ja būtu... Tātad MyISAM tabulai: mysql> create table q (id int primary key) engine=myisam; Query OK, 0 rows affected (0.05 sec) mysql> explain select count(*) from q; +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ 1 row in set (0.00 sec) mysql> explain select count(id) from q; +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-------+------+---------------+------+---------+------+----- -+------------------------------+ 1 row in set (0.00 sec) Kas tad tur bija redzams? Tātad MySQL fīča serializēt insertus u.c. darbības ar tabulu šoreiz sevi attaisno pilnā mērā un MyISAM tabulai ierakstu skaitu var dabūt bez vispār jebkādas tabulas vai indeksa pilnas skanēšanas. Bet, ja to pašu izdara innodb tabulai: mysql> create table q1 (id int primary key) engine=innodb; Query OK, 0 rows affected (0.09 sec) mysql> explain select count(*) from q1; +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ | 1 | SIMPLE | q1 | index | NULL | PRIMARY | 4 | NULL | 1 | Using index | +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ 1 row in set (0.02 sec) mysql> explain select count(id) from q1; +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ | 1 | SIMPLE | q1 | index | NULL | PRIMARY | 4 | NULL | 1 | Using index | +----+-------------+-------+-------+---------------+---------+---------+------+- -----+-------------+ 1 row in set (0.00 sec) Tad redzams, ka abos gadījumos skanē primārās atslēgas indeksu un tādējādi noskaidro tabulas ierakstu skaitu, kā tas arī būs lielākajā daļā DBVSu. Tātad MySQLs vismaz mana konkrētā 5.1.52-community MySQL Community Server (GPL) versija ir pietiekami gudra, lai saprastu, ka primārajā atslēgā NULL vērtību nevar būt un tās visas ir unikālas, tātad count(*) ir identisks count(id). BET tas nemaina lietas būtību tam, ka count(id) VISPĀRĪGĀ GADĪJUMĀ NAV TAS PATS, KAS count(*) un nevajag izmantot bezsakarīgus aizstājējus lietai, kas ir visiem zināma un vispārpieņemta - count(*) parasti lieto un noklusēti visi to saprot kā visu ierakstu skaitīšanu. Un ja ir kaut kas cits, tad DBVS var to saprast tāpat, var arī nesaprast. Kas vēl būtiskāk - citiem cilvēkiem rodas nesapratne - kāpēc tā ir darīts? Vai tam ir kāda jēga, jebšu kāds nodarbojies ar nevajadzīgiem eksperimentiem. Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted January 12, 2011 Report Share Posted January 12, 2011 No kura laika?.... Pierādi! =P Skjiet ka no vers. 3.xx. MYSQL dokumentaacijaa ;) Quote Link to comment Share on other sites More sharing options...
daGrevis Posted January 12, 2011 Report Share Posted January 12, 2011 Labi, labi. Sapratu... =)) Vienkārši zinu, ka šādi ir lēnāk... SELECT * FROM foo ...nekā... SELECT x, y, z FROM foo ...kaut vai tikai tāpēc, ka nevienmēr vajag visus row'us. =P Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 12, 2011 Report Share Posted January 12, 2011 ...kaut vai tikai tāpēc, ka nevienmēr vajag visus row'us. =P kolonas Jo rindas abi atgriež visas ;) Bet ideja ļoti pareiza, kaut visi tā domātu. Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
briedis Posted January 12, 2011 Report Share Posted January 12, 2011 (edited) Labi, labi. Sapratu... =)) Vienkārši zinu, ka šādi ir lēnāk... SELECT * FROM foo ...nekā... SELECT x, y, z FROM foo ...kaut vai tikai tāpēc, ka nevienmēr vajag visus row'us. =P Es cenšos rakstīt kolonnas, jo bonuss tam ir tas, ka tiešām nevienmēr visas vajag, un, ja nākas veikt papildinājumus kodā, tad tu vari uzmest aci, kādas kolonnas tad tiek atlasīta, savādāk būtu jāiet kādā phpmyadminā un jāskatās, kādas kolonnas ir tajā tabulā, a savādāk uzreiz redzams! Tas tā, domājot par nākotni :) Edited January 12, 2011 by briedis Quote Link to comment Share on other sites More sharing options...
spainis Posted January 12, 2011 Report Share Posted January 12, 2011 bet tā sanāk 10 vietās rakstīt sql'us, uzraksti vienu mappera klasi ar statiskām metodēm, kas izpilda standarta sql darbības un to izmanto tālāk, refactoring's rullē bottleneck's tāpat sanāk RPC uz DB Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.