ما مدى الخطأ في وجود فهرس فريد وطبيعي في نفس العمود؟

StackOverflow https://stackoverflow.com/questions/292230

  •  08-07-2019
  •  | 
  •  

سؤال

لدي هيكل الجدول التالي

CREATE TABLE `table` (
  `id` int(11) NOT NULL auto_increment,
  `date_expired` datetime NOT NULL,
  `user_id` int(11) NOT NULL,
  `foreign_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `date_expired` (`date_expired`,`user_id`,`foreign_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

كما ستلاحظ، لدي فهارس مكررة على user_id: date_expired & user_id.أريد بالطبع الفهرس الفريد لأنني أريد التأكد من أن البيانات فريدة.

سبب الفهارس المكررة هو أنه بدون user_id الفهرس، يستغرق استعلام البحث الرئيسي 4 ثوانٍ.مع الفهرس الإضافي يستغرق الأمر ثانية واحدة.الاستعلام ينضم إلى الجدول user_id والتحقق date_expired.

يحتوي الجدول على 275 سجلاً فقط.

  • ما مدى سوء وجود فهرس فريد وطبيعي في نفس المجال؟
  • ما مدى سوء وجود فهارس أكبر من البيانات عندما يكون الجدول عبارة عن معرفات بحتة؟
هل كانت مفيدة؟

المحلول

أعتقد أنه إذا قمت بإنشاء الفهرس الفريد الخاص بك كـ (user_id, date_expired, foreign_id)، سوف تحصل على نفس الفائدة من وجود فهرس عادي user_id مع الفهرس الفريد فقط.يمكن لـ MySQL استخدام الأعمدة الأولى لأي فهرس لتقليل عدد الصفوف في الصلة بنفس طريقة الفهرس الموجود على user_id.

يرى وثائق فهرس MySQL للمزيد من المعلومات.

هل تقصد id عمود auto_increment في مكان آخر في مخططك لتوفير المساحة؟نظرًا لأن الفهرس الفريد الخاص بك يغطي جميع الأعمدة الأخرى في جدولك، فهو في جوهره مفتاح أساسي بحد ذاته ويمكن إسقاطه إذا لم تكن كذلك.

يمكنك التحقق من المفاتيح التي يستخدمها استعلامك عن طريق وضع البادئة عليه بـ EXPLAIN.

نصائح أخرى

لا أفهم ماذا تقصد بالفهارس المكررة.لديك ثلاثة فهارس في الجدول:

  1. واحد للمفتاح الأساسي "معرف" (والذي يعني فريدًا)
  2. رقم فريد آخر للجمع بين "date_expired" و"user_id" و"foreign_id"
  3. والثالث على "user_id" فقط

لذلك ليس هناك ازدواجية، لديك ثلاثة مختلف الفهارس التي سوف تفعل أشياء مختلفة.أنت بحاجة إلى رقم 3 لتسريع الاستعلامات المتعلقة بـ user_id وهو ما تراه.لذلك ليس هناك خطأ في هذا الجدول بالذات، فأنت لا تكرر أي شيء.أما السؤال الثاني فهو يعتمد على احتياجاتك، لكنه بالتأكيد ليس كذلك سيء للحصول على مساحة أكبر مستخدمة في الفهارس مقارنة بالبيانات.

الأمر السيئ، على سبيل المثال، هو أن يكون لديك UNIQUE ('user_id') ولاحقًا KEY('user_id') (لست متأكدًا حتى مما إذا كانت MySQL ستسمح بذلك) لأن أحد الفهرس سيحتوي على الآخر ولا يوجد شيء ليكتسب.

إن وجود عدة فهارس بما في ذلك حقل واحد ليس بالأمر السيئ على الإطلاق (في الأساس، يقومون بفهرسة أشياء مختلفة).له تأثير طفيف على أداء الكتابة، ولكن هذه هي المقايضة النموذجية التي تحصل عليها مع كل مؤشر في المقام الأول.إن وجود فهارس تستهلك مساحة أكبر من البيانات نفسها ليس أمرًا سيئًا إذا كانت المساحة رخيصة.في حالتك، ينبغي أن يكون رخيصًا نظرًا لحقيقة أن لديك عددًا صغيرًا جدًا من الإدخالات.

والسؤال الذي أود أن أطرحه في موقفك هو:كيف تؤثر فهرسة هذا الجدول الصغير بشدة على وقت تشغيل الاستعلام الخاص بي؟ربما كنت تفعل شيئًا خاطئًا (أفكر في الكثير من الاستعلامات التي قد تكون زائدة عن الحاجة إلى هذا الجدول)، حيث لا ينبغي أن يكون أي واحد قريبًا من هذا النطاق الزمني مع هذا العدد الصغير من الإدخالات).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top