mysql - ডেটাবেজ ম্যানেজমেন্ট সিস্টেম pdf



MySQL ডাটাবেসের সকল সারণির জন্য রেকর্ড গণনা পান (11)

@ ভেনকাত্রামানান এবং অন্যান্যদের মতো আমি INFORMATION_SCHEMA খুঁজে পেয়েছি। TABLES অবিশ্বস্ত (INoDB, MySQL 5.1.44 ব্যবহার করে), যা আমি প্রত্যেকটি সারি গণনা করে প্রতিবার টেবিলেও চালাতে পারি। এখানে একটি অপেক্ষাকৃত হ্যাকি (কিন্তু নমনীয় / অভিযোজিত) একটি বড় SQL বিবৃতি তৈরি করার উপায় যা আপনি রুবি রত্ন এবং স্টাফ ইনস্টল না করেই নতুন ক্যোয়ারীতে পেস্ট করতে পারেন।

SELECT CONCAT(
    'SELECT "', 
    table_name, 
    '" AS table_name, COUNT(*) AS exact_row_count FROM `', 
    table_schema,
    '`.`',
    table_name, 
    '` UNION '
) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE table_schema = '**my_schema**';

এটা এই মত আউটপুট উত্পাদন করে:

SELECT "func" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.func UNION                         
SELECT "general_log" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.general_log UNION           
SELECT "help_category" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_category UNION       
SELECT "help_keyword" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_keyword UNION         
SELECT "help_relation" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_relation UNION       
SELECT "help_topic" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.help_topic UNION             
SELECT "host" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.host UNION                         
SELECT "ndb_binlog_index" AS table_name, COUNT(*) AS exact_row_count FROM my_schema.ndb_binlog_index UNION 

ভালো ইউনূস ছাড়া ভালো আউটপুট পেতে ছাড়া কপি এবং পেস্ট করুন,

+------------------+-----------------+
| table_name       | exact_row_count |
+------------------+-----------------+
| func             |               0 |
| general_log      |               0 |
| help_category    |              37 |
| help_keyword     |             450 |
| help_relation    |             990 |
| help_topic       |             504 |
| host             |               0 |
| ndb_binlog_index |               0 |
+------------------+-----------------+
8 rows in set (0.01 sec)

প্রতিটি টেবিলে একটি SELECT count() ছাড়াই একটি MySQL ডাটাবেসের সমস্ত সারণিতে সারিগুলির গণনা করার উপায় আছে কি?


Answer #1

আপনি এই চেষ্টা করতে পারেন। এটা আমার জন্য জরিমানা কাজ করছে।

SELECT IFNULL(table_schema,'Total') "Database",TableCount 
FROM (SELECT COUNT(1) TableCount,table_schema 
      FROM information_schema.tables 
      WHERE table_schema NOT IN ('information_schema','mysql') 
      GROUP BY table_schema WITH ROLLUP) A;

Answer #2

আপনি সঠিক সংখ্যা চান, নিম্নলিখিত ruby ​​স্ক্রিপ্ট ব্যবহার করুন। আপনি রুবি এবং RubyGems প্রয়োজন।

নিম্নলিখিত রত্ন ইনস্টল করুন:

$> gem install dbi
$> gem install dbd-mysql

ফাইল: count_table_records.rb

require 'rubygems'
require 'dbi'

db_handler = DBI.connect('DBI:Mysql:database_name:localhost', 'username', 'password')

# Collect all Tables
sql_1 = db_handler.prepare('SHOW tables;')
sql_1.execute
tables = sql_1.map { |row| row[0]}
sql_1.finish

tables.each do |table_name|
  sql_2 = db_handler.prepare("SELECT count(*) FROM #{table_name};")
  sql_2.execute
  sql_2.each do |row|
    puts "Table #{table_name} has #{row[0]} rows."
  end
  sql_2.finish
end

db_handler.disconnect

কমান্ড লাইন ফিরে যান:

$> ruby count_table_records.rb

আউটপুট:

Table users has 7328974 rows.

Answer #3

আপনি সম্ভবত টেবিল টেবিল সঙ্গে একসঙ্গে কিছু করা যেতে পারে। আমি কখনও এটি করেছি না, কিন্তু মনে হচ্ছে এটিতে TABLE_ROWS এর জন্য একটি কলাম রয়েছে এবং টেবিল NAME এর জন্য একটি।

প্রতি টেবিলে সারি পেতে, আপনি এই মত একটি প্রশ্ন ব্যবহার করতে পারেন:

SELECT table_name, table_rows
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '**YOUR SCHEMA**';

Answer #4

আমি শুধু রান:

show table status;

এটি আপনাকে প্রতিটি টেবিলে প্লাস গণনা এবং অন্যান্য তথ্যের একটি গুচ্ছ দেবে। আমি উপরে নির্বাচিত উত্তর ব্যবহার করতে ব্যবহৃত, কিন্তু এই অনেক সহজ।

আমি নিশ্চিত না যে এটি সমস্ত সংস্করণগুলির সাথে কাজ করে তবে আমি InnoDB ইঞ্জিন দিয়ে 5.5 ব্যবহার করছি।


Answer #5

আরও একটি বিকল্প: অ InnoDB এর জন্য এটি ইনোওডিবি - সঠিক গণনা পেতে গণনা (*) এর জন্য info_schema.TABLES (এটি দ্রুত হিসাবে) থেকে ডেটা ব্যবহার করে। এছাড়াও এটি দৃষ্টিভঙ্গি উপেক্ষা করে।

SET @table_schema = DATABASE();
-- or SET @table_schema = 'my_db_name';

SET GROUP_CONCAT_MAX_LEN=131072;
SET @selects = NULL;

SELECT GROUP_CONCAT(
        'SELECT "', table_name,'" as TABLE_NAME, COUNT(*) as TABLE_ROWS FROM `', table_name, '`'
        SEPARATOR '\nUNION\n') INTO @selects
  FROM information_schema.TABLES
  WHERE TABLE_SCHEMA = @table_schema
        AND ENGINE = 'InnoDB'
        AND TABLE_TYPE = "BASE TABLE";

SELECT CONCAT_WS('\nUNION\n',
  CONCAT('SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND ENGINE <> "InnoDB" AND TABLE_TYPE = "BASE TABLE"'),
  @selects) INTO @selects;

PREPARE stmt FROM @selects;
EXECUTE stmt USING @table_schema;
DEALLOCATE PREPARE stmt;

যদি আপনার ডাটাবেসটিতে প্রচুর সংখ্যক InnoDB টেবিল থাকে তবে সমস্ত সারি গণনা আরো সময় নিতে পারে।


Answer #6

এই সংরক্ষিত পদ্ধতি টেবিল তালিকা, রেকর্ড গণনা, এবং শেষে রেকর্ড মোট সংখ্যা উত্পাদন করে।

এই পদ্ধতি যোগ করার পরে এটি চালানোর জন্য:

CALL `COUNT_ALL_RECORDS_BY_TABLE` ();

-

কার্যপ্রণালী:

DELIMITER $$

CREATE DEFINER=`root`@`127.0.0.1` PROCEDURE `COUNT_ALL_RECORDS_BY_TABLE`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE TNAME CHAR(255);

DECLARE table_names CURSOR for 
    SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE();

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN table_names;   

DROP TABLE IF EXISTS TCOUNTS;
CREATE TEMPORARY TABLE TCOUNTS 
  (
    TABLE_NAME CHAR(255),
    RECORD_COUNT INT
  ) ENGINE = MEMORY; 


WHILE done = 0 DO

  FETCH NEXT FROM table_names INTO TNAME;

   IF done = 0 THEN
    SET @SQL_TXT = CONCAT("INSERT INTO TCOUNTS(SELECT '" , TNAME  , "' AS TABLE_NAME, COUNT(*) AS RECORD_COUNT FROM ", TNAME, ")");

    PREPARE stmt_name FROM @SQL_TXT;
    EXECUTE stmt_name;
    DEALLOCATE PREPARE stmt_name;  
  END IF;

END WHILE;

CLOSE table_names;

SELECT * FROM TCOUNTS;

SELECT SUM(RECORD_COUNT) AS TOTAL_DATABASE_RECORD_CT FROM TCOUNTS;

END

Answer #7

নিম্নোক্ত প্রশ্নটি একটি (নথির) ক্যোয়ারী তৈরি করে যা info_schema.tables এ তালিকাভুক্ত প্রতিটি স্কিম থেকে প্রতিটি টেবিলের জন্য গণনা (*) মান পাবে। এখানে দেখানো প্রশ্নের সম্পূর্ণ ফলাফল - একসাথে নেওয়া সমস্ত সারি - একটি সেমিকোলন-এ কোনও ঝুঁকিপূর্ণ 'ইউনিয়ন' থাকা একটি বৈধ SQL বিবৃতি অন্তর্ভুক্ত। ঝুঁকিপূর্ণ ইউনিয়ন নীচের প্রশ্নের মধ্যে একটি ইউনিয়ন ব্যবহার দ্বারা এড়ানো হয়।

select concat('select "', table_schema, '.', table_name, '" as `schema.table`,
                          count(*)
                 from ', table_schema, '.', table_name, ' union ') as 'Query Row'
  from information_schema.tables
 union
 select '(select null, null limit 0);';

Answer #8

প্রকৃত গণনা পেতে আমি এইটি করি (স্কিমা ব্যবহার করে না)

এটা ধীর কিন্তু আরো সঠিক।

এটি একটি দুই ধাপে প্রক্রিয়া

  1. আপনার ডিবি জন্য টেবিল তালিকা পান। আপনি এটি ব্যবহার করে পেতে পারেন

    mysql -uroot -p mydb -e "show tables"
  2. এই ব্যাশ স্ক্রিপ্টে অ্যারে পরিবর্তনশীলের টেবিলগুলির তালিকা তৈরি এবং বরাদ্দ করুন (নীচের কোডের মতো একটি একক স্পেস দ্বারা পৃথক)

    array=( table1 table2 table3 )
    
    for i in "${array[@]}"
    do
        echo $i
        mysql -uroot mydb -e "select count(*) from $i"
    done
  3. চালাও এটা:

    chmod +x script.sh; ./script.sh

Answer #9

যদি আপনি টেবিলের সংখ্যা এবং তাদের নামগুলি জানেন এবং তাদের প্রত্যেকটির প্রাথমিক কী আছে বলে ধরে নেওয়া হয়, তবে আপনি প্রতিটি সারণী থেকে আসা সারিগুলি পেতে COUNT(distinct [column]) সহ একটি ক্রস যোগদান ব্যবহার করতে পারেন।

SELECT 
   COUNT(distinct t1.id) + 
   COUNT(distinct t2.id) + 
   COUNT(distinct t3.id) AS totalRows
FROM firstTable t1, secondTable t2, thirdTable t3;

এখানে একটি এসকিউএল Fiddle উদাহরণ।


Answer #10
 SELECT TABLE_NAME,SUM(TABLE_ROWS) 
 FROM INFORMATION_SCHEMA.TABLES 
 WHERE TABLE_SCHEMA = 'your_db' 
 GROUP BY TABLE_NAME;

যে আপনি প্রয়োজন।





rowcount