মাইএসকিউএলে কোনও সারণীর ডাটা আকার এবং সূচী আকার কীভাবে অনুমান / পূর্বাভাস দেওয়া যায়


26

আমি টেবিলের আকার নির্ধারণের সর্বোত্তম উপায়টি কী তা খুঁজে পাচ্ছি যার জন্য আমি প্রচুর ব্লগ এবং ফোরাম অধ্যয়ন করেছি তবে সঠিক উত্তর খুঁজে পেতে অক্ষম

উদাহরণস্বরূপ, আমাদের ইনোডিবি ইঞ্জিন সহ একটি টেবিল সিটি রয়েছে , ভবিষ্যতে বলতে দিন (এর পরের 1 বছরে) এটির 1 মিলিয়ন রেকর্ড থাকবে সুতরাং এই সময়ের মধ্যে সেই টেবিলটির আনুমানিক ডেটা আকার এবং সূচী আকারটি কী হবে।

mysql> desc City;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

হালনাগাদ

1 মিলিয়ন রেকর্ড সহ আনুমানিক উপরের বাউন্ড (সারণির সর্বাধিক আকার) কী হবে এবং আমরা কীভাবে এটি অনুমান করতে পারি।


এটা অসাধারণ. তবে সূচকের আকারের কলামটি কীভাবে পাওয়া সম্ভব? এর অর্থ কী যদি আপনার কাছে একটি টেবিল থাকে (বলুন) 5 টি কলাম ইনডেক্সড। আমরা কি তাদের প্রত্যেকের সূচকের আকার পেতে পারি? আমি এটি অন্য প্রশ্ন হিসাবে জিজ্ঞাসা করব। ধন্যবাদ
সুশীল

উত্তর:


51

সারণির বিবরণ দেওয়া, আমি দেখতে

  • তথ্য সারি প্রতি 66 বাইট
  • প্রাথমিক কীটির জন্য সারি প্রতি 4 বাইট
  • দেশের কোড সূচকের জন্য সারি প্রতি 7 বাইট
    • দেশের জন্য 3 বাইট
    • দেশীয় কোডের সাথে সংযুক্ত ক্লাস্টার কী জন্য 4 বাইট
  • ডেটা এবং কীগুলির মোট 77 বাইট
  • এটি বিটিআরই বা টেবিলস্পেস ফ্র্যাগমেন্টেশনের জন্য গৃহস্থালি সংরক্ষণের কাজ করে না

মিলিয়ন সারিগুলির জন্য, এটি 77,000,000 বাইট (73.43 এমবি) হবে

সারণিটি পরিমাপ করার জন্য, প্রদত্ত টেবিলের জন্য mydb.mytable, আপনি এই কোয়েরিটি চালাতে পারেন

SELECT 
    CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',SUBSTR(units,pw1*2+1,2)) DATSIZE,
    CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',SUBSTR(units,pw2*2+1,2)) NDXSIZE,
    CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',SUBSTR(units,pw3*2+1,2)) TBLSIZE
FROM
(
    SELECT DAT,NDX,TBL,IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (
        SELECT data_length DAT,index_length NDX,data_length+index_length TBL,
        FLOOR(LOG(IF(data_length=0,1,data_length))/LOG(1024)) px,
        FLOOR(LOG(IF(index_length=0,1,index_length))/LOG(1024)) py,
        FLOOR(LOG(data_length+index_length)/LOG(1024)) pz
        FROM information_schema.tables
        WHERE table_schema='mydb'
        AND table_name='mytable'
    ) AA
) A,(SELECT 'B KBMBGBTB' units) B;

ডেটাবেস এবং স্টোরেজ ইঞ্জিন দ্বারা গোষ্ঠীযুক্ত সমস্ত সারণী পরিমাপ করতে

SELECT
    IF(ISNULL(DB)+ISNULL(ENGINE)=2,'Database Total',
    CONCAT(DB,' ',IFNULL(ENGINE,'Total'))) "Reported Statistic",
    LPAD(CONCAT(FORMAT(DAT/POWER(1024,pw1),2),' ',
    SUBSTR(units,pw1*2+1,2)),17,' ') "Data Size",
    LPAD(CONCAT(FORMAT(NDX/POWER(1024,pw2),2),' ',
    SUBSTR(units,pw2*2+1,2)),17,' ') "Index Size",
    LPAD(CONCAT(FORMAT(TBL/POWER(1024,pw3),2),' ',
    SUBSTR(units,pw3*2+1,2)),17,' ') "Total Size"
FROM
(
    SELECT DB,ENGINE,DAT,NDX,TBL,
    IF(px>4,4,px) pw1,IF(py>4,4,py) pw2,IF(pz>4,4,pz) pw3
    FROM 
    (SELECT *,
        FLOOR(LOG(IF(DAT=0,1,DAT))/LOG(1024)) px,
        FLOOR(LOG(IF(NDX=0,1,NDX))/LOG(1024)) py,
        FLOOR(LOG(IF(TBL=0,1,TBL))/LOG(1024)) pz
    FROM
    (SELECT
        DB,ENGINE,
        SUM(data_length) DAT,
        SUM(index_length) NDX,
        SUM(data_length+index_length) TBL
    FROM
    (
       SELECT table_schema DB,ENGINE,data_length,index_length FROM
       information_schema.tables WHERE table_schema NOT IN
       ('information_schema','performance_schema','mysql')
       AND ENGINE IS NOT NULL
    ) AAA GROUP BY DB,ENGINE WITH ROLLUP
) AAA) AA) A,(SELECT ' BKBMBGBTB' units) B;

এই প্রশ্নগুলি চালান এবং আপনি ডাটাবেস / ইঞ্জিন ডিস্ক ব্যবহারের পরিবর্তনগুলি ট্র্যাক করতে পারেন।

একবার চেষ্টা করে দেখো !!!


1
আপনার টেবিলের সমস্ত মাপ দেখার জন্য এটি দুর্দান্ত একটি ক্যোয়ারী।
ghayes

আপনার যদি CHARদৈর্ঘ্য হয় তবে 3 দ্বারা গুণ করা দরকার CHARSET utf8। সম্পূর্ণ ওভারহেডটি গণনা দ্বিগুণ বা তিন গুণ করে অনুমান করা যায়।
রিক জেমস

@ রোল্যান্ডোমাইএসকিউএলডিবিএ, আপনি কি জানেন যে কোনও টেবিলের "আসল" সারি আকারটি প্রকৃত আকারের সাথে (সংক্ষেপিত টেবিলের সাথে তুলনা করা) এবং সংকোচনের অনুপাত পাওয়া সম্ভব কিনা?
সিনিয়রমার্ট

@ সিনমার্ট ইনোডব_পৃষ্ঠা_সাইজটি স্থির হয়েছে (ডিফল্টরূপে ১K কে বা ১3৩৮৪) এবং সীমাতে সীমাবদ্ধ বা গোষ্ঠীভূত বা বিভক্ত হয়ে যাওয়ার সীমানা হয়ে যায়। ইনোডাব_পেজ_সাইজ পরিবর্তন করা ভাল বা খারাপের জন্য ডেটা সংরক্ষণের ক্ষেত্রে পরিবর্তন ঘটাতে পারে aএকটি সারিতে কীভাবে পরিপূর্ণ বা স্পার করা হয় তার ভিত্তিতে (বিশেষত টেক্সট / বিএলএব / ভিচারার উপস্থিতির সাথে)। সর্বোপরি, আপনার অনুপাতের অনুমানের জন্য স্কিমা রিপোর্টের সাথে .ibd ফাইলের আকারের তুলনা করা উচিত। ALTER TABLE ... ENGINE=InnoDB;একটি সঠিক অনুপাত পেতে আপনার একটি নল অল্টার টেবল ( ) সঞ্চালন করতেও পারে । প্রচেষ্টা এটি মূল্যবান হতে পারে না।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ সিনমার্ট মনে রাখবেন টুপি-বাই-টেবিল সেটিংস ইনোডাব_পেজ_সাইজ পরিবর্তন করা hat আপনাকে ডেটাটির সম্পূর্ণ রফতানি করতে হবে (দেখুন mariadb.com/kb/en/library/how-to- بدل-innodb_page_size )
RolandoMySQLDBA

4

আপনি যদি InnoDB টেবিল ব্যবহার করে থাকেন তবে আপনি থেকে ডেটা / স্বতন্ত্র সূচকের জন্য আকারটি পেতে পারেন mysql.innodb_index_stats। 'আকার' স্ট্যাটে উত্তরগুলিতে পৃষ্ঠাগুলি রয়েছে, সুতরাং আপনাকে এটি পৃষ্ঠা-আকার দিয়ে গুণ করতে হবে, এটি ডিফল্টরূপে 16 কে

select database_name, table_name, index_name, stat_value*@@innodb_page_size
from mysql.innodb_index_stats where stat_name='size';

সূচকের প্রাথমিক তথ্যটি হ'ল ডেটা।


1
এটি ধরে নেয় আপনার টেবিলে ডেটা রয়েছে; মনে হয় ওপি জনসংখ্যার আগে অনুমান করতে চায়।
রিক জেমস

0
SELECT  Table_NAME "tablename",
           data_length   "table data_length in Bytes",
           index_length  "table index_length in Bytes",
           data_free  "Free Space in Bytes"
    FROM  information_schema.TABLES  where  Table_schema = 'databasename';

এই ক্যোয়ারীটি সম্পাদন করে আপনি কোনও টেবিলের জন্য Dataএবং Indexএর জন্য আকার ব্যবহার করতে পারেন, আপনি এই আকারটি # টি সারি এর বিপরীতে পরীক্ষা করতে পারেন এবং 1 মিলিয়ন সারির জন্য ভবিষ্যদ্বাণী করতে পারেন


1
আমি নিশ্চিত নই তবে এটি কি কিছু সঠিক ফলাফল দেবে? আপনি কি কখনও এটি পরীক্ষা করেছেন?
আব্দুল মানাফ

প্রকৃতপক্ষে আমি এই কোয়েরি ফলাফলটি পর্যায়ক্রমে বৃদ্ধির (%) আকারের আকার পরীক্ষা করতে
যাচ্ছি

0

আপনার কাছে এখনও ডেটা না থাকলে এখানে কিছু টিপস। নিম্নলিখিত InnoDB প্রযোজ্য। (মাইআইএসএএম অনেক সহজ এবং ছোট)

CHARপরিবর্তনশীল-দৈর্ঘ্যের কলামগুলির জন্য ব্যবহার করবেন না । আপনি CHARACTER SETকি ব্যবহার করছেন? অ্যাস্কির চরিত্র অনুযায়ী একটি বাইট প্রয়োজন; utf8mb4 এর 1 থেকে 4 এর মধ্যে প্রয়োজন।

4 bytes per INT
35 for CHAR(35), if ascii or latin1; varchar is probably less
3 for the country code; it is fixed length
etc

মোট = প্রায় 80 বাইট।

বিভিন্ন ওভারহেডের জন্য অ্যাকাউন্ট করতে 2 কে 3 এর মধ্যে 80 দিয়ে গুণ করুন। সম্ভবত 1 এম সারি টেবিল 160MB এবং 240MB এর মধ্যে হবে।

একক সূচকটি পরিমাপ করতে CountryCode, 3 বাইটের জন্য:

3 bytes data
4 bytes for the PK (implicitly included with any secondary key)
25 bytes basic overhead
32 total
times 1.5 -- overhead for BTree that was randomly inserted into
48MB -- total for 1M rows.

নোট:

  • কেবল পাত নোডগুলি (বিটিআরগুলির) গণনা করা দরকার; নন-লিফ নোডগুলির জন্য ওভারহেড সাধারণত 1% হয়।

  • PRIMARY KEY"ক্লাস্টার" হয় ডেটার সাথে, তাই এটি গনা কোন প্রয়োজন নেই।

  • আপনার যদি স্পষ্টত পিকে না থাকে তবে মনগড়া পিকে করার জন্য আপনাকে সারি আকারে 6 বাইট যুক্ত করতে হবে।

  • ROW_FORMAT = COMPRESSEDআপনাকে প্রায় 2: 1 সংকোচন দেয়। (এটি সাধারণত জিপ (ইত্যাদি) 3: 1 এর সংকোচনের হারের মতো ভাল নয় good)

  • SHOW TABLE STATUS LIKE "tablename";হ'ল 'আসল' আকারের দ্রুত গণনা করার উপায়। Data_lengthডেটা এবং পিকে জন্য দেখুন ; Index_lengthসেকেন্ডারি ইনডেক্স এবং Data_freeঅন্য কিছু স্টাফের জন্য।

  • এটি Index_lengthঅতিক্রম করার জন্য বিরল Data_length। তবে এটি হওয়ার জন্য এটি "ভুল" নয়।


-1

এটা ক্লান্তিকর। তবে বিশদটি ডক্সে রয়েছে

যথাসম্ভব যথাযথ হতে, যা খুব কমই প্রয়োজনীয়, আপনার টেবিল কাঠামো এবং সূচী কাঠামো সম্পর্কেও পড়তে হবে।

আমি যদি আপনার জুতোতে থাকি, আমি টেবিলটি তৈরি করতাম, এটি মিলিয়নে মিলিয়ন সারির পরীক্ষার ডেটা দিয়ে তৈরি করতাম এবং আকার পরিবর্তনটি পরিমাপ করতাম। আপনার প্রয়োগের উপর নির্ভর করে আপনারও লেনদেনের লগ ফাইলগুলির আকারটি অ্যাকাউন্টে নেওয়ার প্রয়োজন হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.