นับแถวของตาราง


คำตอบ:


237
SELECT COUNT(*) FROM fooTable;

จะนับจำนวนแถวในตาราง

ดูคู่มืออ้างอิง


7
จะเร็วกว่านี้หรือไม่เมื่อฉันใช้ชื่อคอลัมน์ที่จัดทำดัชนีแทนที่จะเป็น *? เช่นนี้: SELECT COUNT (id) จากtablename

1
เพียงเล็กน้อย. ฉันได้ตารางแถว 21961904 ซึ่ง COUNT ของเขาถูกสอบถามใน 115 วินาทีในขณะที่ใช้ ID ใช้เวลา 107 วินาที
Bondolin

2
COUNT (*) เป็นคำจำกัดความของภาษาที่เข้มงวด คุณจะได้รับข้อผิดพลาดในการแยกวิเคราะห์ถ้าคุณลองใช้ COUNT (*) บันทึกช่องว่าง
ppostma1

9
คุณสามารถทำได้สิ่งCOUNT(1)นี้จะเป็นวิธีที่เร็วที่สุด
โชตะ Papiashvili

วิธีที่ดีที่สุดในการใช้ COUNT () เพื่อเขียนตัวแปรใน PHP คืออะไร ฉันจะทำ "... COUNT (*) AS rowCount ... " ใน SQL หรือไม่ใช้ $ results-> num_rows หรือมีวิธีเรียกผลลัพธ์นี้โดยตรงหรือไม่
Nosajimiki

71

เพราะไม่มีใครพูดถึงมัน:

show table status;

แสดงรายการตารางทั้งหมดพร้อมกับข้อมูลเพิ่มเติมรวมถึงแถวโดยประมาณสำหรับแต่ละตาราง นี่คือสิ่งที่ phpMyAdmin ใช้สำหรับหน้าฐานข้อมูล

ข้อมูลนี้มีอยู่ใน MySQL 4 อาจอยู่ใน MySQL 3.23 เช่นกันฐานข้อมูลสคีมาข้อมูลเป็นเวลานาน

UPDATE:

เนื่องจากมีการลงคะแนนเสียงฉันต้องการชี้แจงว่าจำนวนที่แสดงนั้นเป็นค่าประมาณสำหรับ InnoDB และ TokuDBและเป็นสิ่งที่ถูกต้องสำหรับเครื่องมือจัดเก็บ MyISAM และ Aria (Maria)

ตามเอกสาร :

จำนวนแถว เอ็นจินการเก็บข้อมูลบางอย่างเช่น MyISAM จะเก็บจำนวนที่แน่นอน สำหรับเอนจินการเก็บข้อมูลอื่น ๆ เช่น InnoDB ค่านี้เป็นค่าประมาณและอาจแตกต่างจากค่าจริงมากถึง 40% ถึง 50% ในกรณีเช่นนี้ให้ใช้ SELECT COUNT (*) เพื่อรับจำนวนที่ถูกต้อง

วิธีนี้ยังเป็นวิธีที่เร็วที่สุดในการดูจำนวนแถวใน MySQL เพราะข้อความค้นหา:

select count(*) from table;

ทำการสแกนแบบเต็มตารางสิ่งที่อาจเป็นการดำเนินการที่แพงมากซึ่งอาจใช้เวลาหลายชั่วโมงบนเซิร์ฟเวอร์โหลดขนาดใหญ่ นอกจากนี้ยังเพิ่มดิสก์ I / O

การดำเนินการเดียวกันอาจบล็อกตารางสำหรับส่วนแทรกและอัพเดต - สิ่งนี้เกิดขึ้นเฉพาะกับเอนจินการเก็บข้อมูลที่แปลกใหม่

InnoDB และ TokuDB นั้นใช้ได้กับการล็อคตาราง แต่ต้องการการสแกนเต็มตาราง


3
นี่เป็นวิธีที่มีประสิทธิภาพที่สุดในการนับแถว ฉันสงสัยว่าทำไมมันถึงไม่ใช่คำตอบ? ฉันใช้ InnoDB ด้วยการล็อคตารางจำนวนแถวควรแน่นอนใช่ไหม
Chung Lun Yuen

สำหรับ innodb มันเป็นที่คาดกัน แต่คุณสามารถใช้งานได้ในบางกรณี "เว็บไซต์ของเรามีสมาชิก xxx คน", "เราตรวจพบผลลัพธ์ xxx ที่คล้ายกับคุณ" และอื่น ๆ
Nick

ฉันไม่แน่ใจ. แต่สำหรับ Innodb นั้นไม่ได้นับจริง แต่ค่อนข้างมีประโยชน์สำหรับล้านตารางแถว
Nick

4
การผ่านตารางเพื่อนับแต่ละแถวเพื่อรับจำนวนแถวนั้นค่อนข้างไร้สาระ ดังนั้นฉันชอบคำตอบนี้เช่นกัน
th3penguinwhisperer

35

เรามีวิธีอื่นในการค้นหาจำนวนแถวในตารางโดยไม่ต้องเรียกใช้selectแบบสอบถามในตารางนั้น

อินสแตนซ์ MySQL ทุกตัวมีฐานข้อมูล information_schema หากคุณเรียกใช้แบบสอบถามต่อไปนี้จะให้รายละเอียดที่สมบูรณ์เกี่ยวกับตารางรวมถึงจำนวนแถวโดยประมาณในตารางนั้น

select * from information_schema.TABLES where table_name = 'table_name'\G

นี่เร็วกว่าเช่นกันบนโต๊ะ MyISAM เนื่องจาก MyISAM กำลังเก็บจำนวนแถวอยู่หรือไม่
NaturalBornCamper

ฉันไม่เคยทดสอบสิ่งนี้ใน MyISAM
Santhosh Tangudu



3

เพียงแค่ทำ

SELECT COUNT(*) FROM table;

คุณสามารถระบุเงื่อนไขด้วยที่ไหนหลังจากนั้น

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

หากคุณมีหลายเขตข้อมูลในตารางของคุณและตารางของคุณมีขนาดใหญ่จะดีกว่าอย่าใช้ *เพราะมันโหลดเขตข้อมูลทั้งหมดลงในหน่วยความจำและการใช้ข้อมูลต่อไปนี้จะมีประสิทธิภาพดีกว่า

SELECT COUNT(1) FROM fooTable;

สิ่งนี้ไม่ถูกต้อง ดูstackoverflow.com/questions/5179969// COUNT (1) อาจช้ากว่ามากสำหรับ MyISAM
jcoffland

@jcoffland คุณสามารถลองด้วยตัวเองโดยเฉพาะเมื่อคุณเข้าร่วมหรือเงื่อนไขจะเร็วกว่าการนับ (*) มาก
Yuseferi

2

ตามที่กล่าวไว้โดยSantoshฉันคิดว่าแบบสอบถามนี้เหมาะสมอย่างรวดเร็วในขณะที่ไม่สืบค้นตารางทั้งหมด

ในการส่งคืนผลลัพธ์จำนวนเต็มของจำนวนเรคคอร์ดข้อมูลสำหรับtablenameเฉพาะในฐานข้อมูลเฉพาะ:

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
นี่อาจส่งคืนจำนวนแถวโดยประมาณ ในตัวอย่างหนึ่งฉันได้รับ 55,940,343 แถวโดยใช้ COUNT (*) แต่ 56,163,339 ใช้วิธีนี้ดังนั้นมันจึงปิดลงมากกว่า 200k
jcoffland

@jcoffland ผมกล่าวถึงคำตอบโดย _ Santosh_ ข้างต้นซึ่งระบุผลที่ได้เป็นตัวอย่าง คำตอบของฉันคือแบบสอบถามเชิงปฏิบัติที่มีรายละเอียดมากขึ้น คำตอบค่อนข้างชัดเจนหากคุณต้องการใช้การนับอย่างแม่นยำcount(*)ด้วยการรับรู้ประสิทธิภาพ
Mohammad Kanan


1

คุณต้องใช้ count () ส่งคืนจำนวนแถวที่ตรงกับเกณฑ์ที่ระบุ

select count(*) from table_name;

0

หากคุณมีคีย์หลักหรือคีย์ / ดัชนีที่ไม่ซ้ำกันวิธีการที่เป็นไปได้เร็วขึ้น (ทดสอบด้วยตารางแถว 4 ล้าน)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

จากนั้นรับฟิลด์ความเป็นหัวใจ (ใกล้กับทันที)

คูณด้วย 0.4s ถึง 0.0001ms

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.