# 1071 - নির্দিষ্ট কীটি দীর্ঘ ছিল; সর্বাধিক কী দৈর্ঘ্য 1000 বাইট


106

আমি জানি এই শিরোনামযুক্ত প্রশ্নের উত্তর আগেই দেওয়া হয়েছিল, তবে দয়া করে পড়ুন। পোস্ট করার আগে আমি এই ত্রুটিতে অন্যান্য সমস্ত প্রশ্ন / উত্তরগুলি ভাল করে পড়েছি।

আমি নিম্নলিখিত প্রশ্নের জন্য উপরের ত্রুটিটি পাচ্ছি:

CREATE TABLE IF NOT EXISTS `pds_core_menu_items` (
  `menu_id` varchar(32) NOT NULL,
  `parent_menu_id` int(32) unsigned DEFAULT NULL,
  `menu_name` varchar(255) DEFAULT NULL,
  `menu_link` varchar(255) DEFAULT NULL,
  `plugin` varchar(255) DEFAULT NULL,
  `menu_type` int(1) DEFAULT NULL,
  `extend` varchar(255) DEFAULT NULL,
  `new_window` int(1) DEFAULT NULL,
  `rank` int(100) DEFAULT NULL,
  `hide` int(1) DEFAULT NULL,
  `template_id` int(32) unsigned DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `layout` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`menu_id`),
  KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

কেন এবং কীভাবে এটি ঠিক করতে হবে কারও কি ধারণা আছে? ক্যাচটি হ'ল - এই একই ক্যোয়ারীটি আমার স্থানীয় মেশিনে পুরোপুরি কাজ করে এবং আমার আগের হোস্টেও কাজ করে। বিটিডব্লিউআইটি একটি পরিণত প্রকল্প - পিএইচপিডিভেসেল থেকে - তাই আমি অনুমান করতে পারি যে এই ছেলেরা তারা কী করছে তা জানেন, যদিও আপনি কখনও জানেন না।

কোন ক্লু প্রশংসা।

আমি পিএইচপিএমওয়াই অ্যাডমিন ব্যবহার করছি।

উত্তর:


175

@ ডেভার্ট যেমন বলেছে, আপনার সূচকের মোট দৈর্ঘ্য অনেক দীর্ঘ।

সংক্ষিপ্ত উত্তরটি হ'ল আপনার যে কোনও উপায়ে এত দীর্ঘ VARCHAR কলামগুলি সূচীকরণ করা উচিত নয়, কারণ সূচকটি খুব ভারী এবং অকার্যকর হবে।

প্রিফিক্স সূচকগুলি ব্যবহার করা সর্বোত্তম অনুশীলন হ'ল আপনি কেবলমাত্র ডেটার বাম সাবস্ট্রিংকেই সূচক করছেন। আপনার বেশিরভাগ ডেটা 255 অক্ষরের চেয়ে অনেক কম হবে sh

আপনি সূচকটি সংজ্ঞায়িত করার সাথে সাথে প্রতি কলামে একটি উপসর্গ দৈর্ঘ্য ঘোষণা করতে পারেন। উদাহরণ স্বরূপ:

...
KEY `index` (`parent_menu_id`,`menu_link`(50),`plugin`(50),`alias`(50))
...

তবে প্রদত্ত কলামটির সেরা উপসর্গ দৈর্ঘ্য কত? এটি জানতে একটি পদ্ধতি এখানে রয়েছে:

SELECT
 ROUND(SUM(LENGTH(`menu_link`)<10)*100/COUNT(`menu_link`),2) AS pct_length_10,
 ROUND(SUM(LENGTH(`menu_link`)<20)*100/COUNT(`menu_link`),2) AS pct_length_20,
 ROUND(SUM(LENGTH(`menu_link`)<50)*100/COUNT(`menu_link`),2) AS pct_length_50,
 ROUND(SUM(LENGTH(`menu_link`)<100)*100/COUNT(`menu_link`),2) AS pct_length_100
FROM `pds_core_menu_items`;

এটি আপনাকে সারিগুলির অনুপাত বলে দেয় যে menu_linkকলামে প্রদত্ত স্ট্রিং দৈর্ঘ্যের চেয়ে বেশি নেই । আপনি এটির মতো আউটপুট দেখতে পাবেন:

+---------------+---------------+---------------+----------------+
| pct_length_10 | pct_length_20 | pct_length_50 | pct_length_100 |
+---------------+---------------+---------------+----------------+
|         21.78 |         80.20 |        100.00 |         100.00 |
+---------------+---------------+---------------+----------------+

এটি আপনাকে জানায় যে আপনার 80% স্ট্রিং 20 টির চেয়ে কম অক্ষরের এবং আপনার সমস্ত স্ট্রিং 50 টিরও কম অক্ষরের চেয়ে কম। সুতরাং 50 এর উপসর্গের দৈর্ঘ্যের চেয়ে বেশি সূচকের দরকার নেই এবং 255 অক্ষরের পূর্ণ দৈর্ঘ্যকে সূচক করার দরকার নেই।

PS: INT(1)এবং INT(32)ডেটা টাইপগুলি মাইএসকিউএল সম্পর্কে অন্য একটি ভুল ধারণা বোঝায় indicates সংখ্যার যুক্তিটির স্টোরেজ বা কলামের জন্য অনুমোদিত মানের সীমা সম্পর্কিত কোনও প্রভাব নেই effect INTসর্বদা 4 বাইট হয় এবং এটি সর্বদা -2147483648 থেকে 2147483647 পর্যন্ত মানগুলিকে অনুমতি দেয় The সংখ্যাসূচক যুক্তি প্রদর্শনের সময় প্যাডিং মানগুলির বিষয়ে হয়, আপনি ZEROFILLবিকল্পটি ব্যবহার না করা হলে এর কোনও প্রভাব নেই ।


17
বিস্তারিত ব্যাখ্যার জন্য অনেক ধন্যবাদ। কোনও সমস্যা সমাধানের পাশাপাশি আমি মূল্যবান কিছুও শিখেছি।
CodeVirtuoso

প্রকৃতপক্ষে, সূচীটি নির্ধারণ করা উচিত যে দৈর্ঘ্যের সন্ধানের জন্য খুব দরকারী কোয়েরি। কোনও সূচকের সেরা দৈর্ঘ্য নির্ধারণ করতে এটি কয়েকবার ব্যবহার করা হয়েছে। ভাগ করার জন্য আপনাকে ধন্যবাদ!
নিরাজ কুমার

4
আপনার স্ট্রিংটি কতক্ষণ দীর্ঘ আছে তা পরিমাপ করার জন্য আপনার কার্যকরী ক্যোয়ারিতে একটি সূক্ষ্ম ত্রুটি রয়েছে: আপনি ধরে নিচ্ছেন যে স্ট্রিংগুলি সমস্ত উপস্থিত রয়েছে; যে, তারা সব সেখানে আছে। যদি কিছু শূন্য থাকে তবে এটি আপনার গণনাগুলি ছুঁড়ে ফেলবে এবং সংক্ষিপ্ত স্ট্রিংগুলিকে ছাড়িয়ে যাবে। আপনি গণনা ([ক্ষেত্রের নাম]) গণনা (*) এর পরিবর্তে ব্যবহার করতে চান।
ডি ম্যাক

এটি প্রথম "উপসর্গ" সূচকের চেয়ে বেশি ব্যবহার করবে না।
রিক জেমস

28

এই ত্রুটিটির অর্থ সূচকের দৈর্ঘ্য index1000 বাইটের বেশি। মাইএসকিউএল এবং স্টোরেজ ইঞ্জিনগুলির এই বিধিনিষেধ থাকতে পারে। আমি মাইএসকিউএল 5.5 তে অনুরূপ ত্রুটি পেয়েছি - 'নির্দিষ্ট কীটি খুব দীর্ঘ ছিল; এই স্ক্রিপ্টটি চালানোর সময় সর্বাধিক কী দৈর্ঘ্য 3072 বাইট ':

CREATE TABLE IF NOT EXISTS test_table1 (
  column1 varchar(500) NOT NULL,
  column2 varchar(500) NOT NULL,
  column3 varchar(500) NOT NULL,
  column4 varchar(500) NOT NULL,
  column5 varchar(500) NOT NULL,
  column6 varchar(500) NOT NULL,
  KEY `index` (column1, column2, column3, column4, column5, column6)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ইউটিএফ 8 হ'ল মাল্টি-বাইট, এবং কী দৈর্ঘ্যটি এভাবে গণনা করা হয় - 500 * 3 * 6 = 9000 বাইট।

তবে নোট করুন, পরবর্তী কোয়েরি কাজ করে!

CREATE TABLE IF NOT EXISTS test_table1 (
  column1 varchar(500) NOT NULL,
  column2 varchar(500) NOT NULL,
  column3 varchar(500) NOT NULL,
  column4 varchar(500) NOT NULL,
  column5 varchar(500) NOT NULL,
  column6 varchar(500) NOT NULL,
  KEY `index` (column1, column2, column3, column4, column5, column6)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

... কারণ আমি CHARSET = latin1 ব্যবহার করেছি, এক্ষেত্রে মূল দৈর্ঘ্য 500 * 6 = 3000 বাইট।


7
উত্তরের জন্য ধন্যবাদ, এটি কাজ করে, তবে utf8 চরসেটটি ব্যয় করে। এই বিধিনিষেধটি কীভাবে কাটিয়ে উঠতে পারে (আমার কাছে সম্পূর্ণ সার্ভার অ্যাক্সেস রয়েছে), এটি কি কোনও উপযুক্ত কারণে রয়েছে?
CodeVirtuoso

5
এটি মারাত্মক পরামর্শ, দয়া করে শিখুন কীভাবে চার্সেটগুলি হয় এবং কীভাবে এটি ভবিষ্যতে বড় সমস্যাগুলির কারণ ঘটবে। একটি মিশ্র চরসেট ডাটাবেস কেবলমাত্র যোগদান বা উপ-বাছাই করার সময় সমস্যার কারণ হয় না, এটি আপনার ডেটাটিকে একটি নন-নরমালাইজড ফর্ম্যাটে রাখে এবং পরে সংশোধন করা অসম্ভব হতে পারে।
জেফ্রি

17

আমি এই সমস্যাটি পেয়েছি, এবং নিম্নলিখিতগুলি দ্বারা সমাধান করেছি:

কারণ

মাইআইএসএএম সম্পর্কিত ইউএসএফসিএল, ইউটিএফ 8 অক্ষর সেট এবং সূচিগুলি যা আপনি এখানে পরীক্ষা করতে পারেন সম্পর্কিত একটি জ্ঞাত বাগ রয়েছে।

রেজোলিউশন

  • মাইএসকিউএল InnoDB স্টোরেজ ইঞ্জিন দিয়ে কনফিগার করা হয়েছে তা নিশ্চিত করুন।

  • ডিফল্ট হিসাবে ব্যবহৃত স্টোরেজ ইঞ্জিনটি পরিবর্তন করুন যাতে নতুন টেবিলগুলি সর্বদা যথাযথভাবে তৈরি করা যায়:

    set GLOBAL storage_engine='InnoDb';

  • মাইএসকিউএল 5.6 এবং তার জন্য নিম্নলিখিত ব্যবহার করুন:

    SET GLOBAL default_storage_engine = 'InnoDB';

  • এবং অবশেষে নিশ্চিত হয়ে নিন যে আপনি মাইএসকিউএল-স্থানান্তরিত নির্দেশাবলী অনুসরণ করছেন ।

রেফারেন্স


বেশিরভাগ ক্ষেত্রে, আমরা স্টোরেজ ইঞ্জিনটিকে 'InnoDB' হিসাবে কনফিগার করতে ভুলে যাই। নিম্নলিখিত উত্তরটি সবচেয়ে সহজ একটি এবং সম্ভবত বেশিরভাগ ব্যবহারকারীর জন্য সমস্যাটি সমাধান করবে will ধন্যবাদ
ফ্রেডেরিকো সিজার

10

সারণী তৈরি বা পরিবর্তন করার আগে এই ক্যোয়ারীটি চালান।

SET @@global.innodb_large_prefix = 1;

এটি সর্বোচ্চ কী দৈর্ঘ্য 3072 বাইটে সেট করবে


3

এই সূচি আকারের সীমাটি মাইএসকিউএল-র 64 বিট বিল্ডগুলিতে আরও বড় বলে মনে হচ্ছে।

আমি এই ডেভিয়েশনটি ডেভ ডেটাবেস ডাম্প করার চেষ্টা করেছি এবং এটি একটি স্থানীয় ভিএমওয়্যার গুণে লোড করার চেষ্টা করছি। অবশেষে আমি বুঝতে পারি যে রিমোট ডেভ সার্ভারটি 64 বিট এবং আমি একটি 32 বিট গুণ তৈরি করেছি। আমি সবেমাত্র একটি 64 বিট গুণ তৈরি করেছি এবং আমি স্থানীয়ভাবে ডেটাবেস লোড করতে সক্ষম হয়েছি।


2

আমি এই ত্রুটিটি কেবলমাত্র মূল ডাটাবেসে "দৈর্ঘ্যের" মানগুলি এর কাঠামোগুলি পরিবর্তন করে মোট "1000" প্রায় পরিবর্তিত করে সার্ভারে রফতানি করেই করেছি। :)


2

আমি একই সমস্যার মুখোমুখি হয়েছি, এটি সমাধান করার জন্য নীচের প্রশ্নের ব্যবহার করা হয়েছে।

ডিবি তৈরির সময় আপনি utf-8 এনকোডিং ব্যবহার করতে পারেন

যেমন create database my_db character set utf8 collate utf8mb4;

সম্পাদনা: (মন্তব্যসমূহের পরামর্শ বিবেচনা করে) utf8_bin কে utf8mb4 এ পরিবর্তন করা হয়েছে


4
এটি আমাকে সঠিক দিকে নির্দেশ করেছে। আমার জন্য আমাকে আমার কলেজটি পরিবর্তন করতে হয়েছিল: utf8_general_ci
ইয়ান নিউল্যান্ড

4
এটি সঠিক দিক নয়, এটি করবেন না! মাইএসকিউএলগুলি utf8নয় utf8, এটি একটি বাগড মালিকানাধর্মী ফর্ম্যাট যা কখনও ফলস্বরূপ হওয়া উচিত ছিল না। utf8mb4সত্য utf8এবং সঠিক utf8সমর্থনের জন্য প্রস্তাবিত ডিফল্ট ।
জেফ্রি


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