sql >> Databasteknik >  >> RDS >> Mysql

Varför är det uppskattade radantalet väldigt olika i phpmyadmin-resultaten?

Till skillnad från MyISAM-tabeller håller InnoDB-tabeller inte reda på hur många rader tabellen innehåller.

På grund av detta är det enda sättet att veta det exakta antalet rader i en InnoDB-tabell att inspektera varje rad i tabellen och ackumulera ett antal. Därför, på stora InnoDB-tabeller, utför en SELECT COUNT(*) FROM innodb_table frågan kan vara mycket långsam eftersom den gör en fullständig tabellsökning för att få antalet rader.

phpMyAdmin använder en fråga som SHOW TABLE STATUS för att få ett uppskattat antal rader i tabellen från motorn (InnoDB). Eftersom det bara är en uppskattning, varierar det varje gång du ringer det, ibland kan variationerna vara ganska stora, och ibland är de nära.

Här är ett informativt blogginlägg om COUNT(*) för InnoDB-tabeller av Percona.

MySQL-manualsidan för VISA TABELLSTATUS säger:

Antalet rader. Vissa lagringsmotorer, som MyISAM, lagrar det exakta antalet. För andra lagringsmotorer, såsom InnoDB, är detta värde en approximation och kan variera från det faktiska värdet med så mycket som 40 till 50 %. I sådana fall, använd VÄLJ ANTAL(*) för att få en korrekt räkning.

Sidan om InnoDB-begränsningar går in mer i detalj:

VISA TABELLSTATUS ger inte korrekt statistik om InnoDB-tabeller, förutom den fysiska storleken reserverad av tabellen. Antalet rader är endast en grov uppskattning som används i SQL-optimering.

InnoDB håller inte ett internt antal rader i en tabell eftersom samtidiga transaktioner kan "se" olika antal rader samtidigt. För att bearbeta en SELECT COUNT(*) FROM t uttalande, InnoDB skannar index av tabellen, vilket tar lite tid om indexet inte är helt i buffertpoolen. Om din tabell inte ändras ofta är det en bra lösning att använda MySQL-frågecachen. För att få en snabb räkning måste du använda en räknetabell som du själv skapar och låta din applikation uppdatera den enligt infogning och radering som den gör. Om ett ungefärligt antal rader är tillräckligt, SHOW TABLE STATUS kan användas. Se avsnitt 14.3.14.1, “InnoDB Performance Stämningstips” .



  1. Viloläge användning av PostgreSQL-sekvensen påverkar inte sekvenstabellen

  2. 5 kraftfulla funktioner i Microsoft Access

  3. Hur man installerar SSMS

  4. Uttalas det "S-Q-L" eller "Sequel"?