Jump to content
php.lv forumi

Kas ir labāk?


yeahz

Recommended Posts

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 by codez
Link to comment
Share on other sites

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 by rATRIJS
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by briedis
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...