SORU
1 Aralık 2009, Salı


Bir Bileşik Endeksi kullanmalıyım?

  1. Ne zaman bir veritabanı Bileşik Endeksi kullanmalıyım?
  2. Bir kullanarak performans dallanma nedir Bileşik Endeksi)?
  3. Neden kullanmak Bileşik Endeksi kullanmalıyım?

Örneğin, homes bir tablo var:

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  PRIMARY KEY  (`home_id`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
) ENGINE=InnoDB  ;

Beni geolat geolng, böyle de kompozit bir dizin kullanmak için mantıklı

Yerine

  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),

ile:

KEY `geolat_geolng` (`geolat`, `geolng`)

Eğer:

  • Neden?
  • Performans Bileşik Endeksi kullanarak dal) nedir?

GÜNCELLEME:

Birçok kişi bunu icra ediyorum sorgular üzerine tamamen bağımlı belirtilmiş olduğundan, aşağıda en yaygın sorgu yapılır:

SELECT * FROM homes
WHERE geolat BETWEEN ??? AND ???
AND geolng BETWEEN ??? AND ???

GÜNCELLEME 2:

Veritabanı aşağıdaki şema: ile

CREATE TABLE IF NOT EXISTS `homes` (
  `home_id` int(10) unsigned NOT NULL auto_increment,
  `primary_photo_group_id` int(10) unsigned NOT NULL default '0',
  `customer_id` bigint(20) unsigned NOT NULL,
  `account_type_id` int(11) NOT NULL,
  `address` varchar(128) collate utf8_unicode_ci NOT NULL,
  `city` varchar(64) collate utf8_unicode_ci NOT NULL,
  `state` varchar(2) collate utf8_unicode_ci NOT NULL,
  `zip` mediumint(8) unsigned NOT NULL,
  `price` mediumint(8) unsigned NOT NULL,
  `sqft` smallint(5) unsigned NOT NULL,
  `year_built` smallint(5) unsigned NOT NULL,
  `num_of_beds` tinyint(3) unsigned NOT NULL,
  `num_of_baths` decimal(3,1) unsigned NOT NULL,
  `num_of_floors` tinyint(3) unsigned NOT NULL,
  `description` text collate utf8_unicode_ci,
  `geolat` decimal(10,6) default NULL,
  `geolng` decimal(10,6) default NULL,
  `display_status` tinyint(1) NOT NULL,
  `date_listed` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `contact_email` varchar(100) collate utf8_unicode_ci NOT NULL,
  `contact_phone_number` varchar(15) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`home_id`),
  KEY `customer_id` (`customer_id`),
  KEY `city` (`city`),
  KEY `num_of_beds` (`num_of_beds`),
  KEY `num_of_baths` (`num_of_baths`),
  KEY `geolat` (`geolat`),
  KEY `geolng` (`geolng`),
  KEY `account_type_id` (`account_type_id`),
  KEY `display_status` (`display_status`),
  KEY `sqft` (`sqft`),
  KEY `price` (`price`),
  KEY `primary_photo_group_id` (`primary_photo_group_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;

Aşağıdaki SQL kullanarak:

EXPLAIN SELECT  homes.home_id,
    				address,
    				city,
    				state,
    				zip,
    				price,
    				sqft,
    				year_built,
    				account_type_id,
    				num_of_beds,
    				num_of_baths,
    				geolat,
    				geolng,
    				photo_id,
    				photo_url_dir
    		FROM homes
    		LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
    			AND homes.primary_photo_group_id = home_photos.home_photo_group_id
    			AND home_photos.home_photo_type_id = 2
    		WHERE homes.display_status = true
    		AND homes.geolat BETWEEN -100 AND 100
    		AND homes.geolng BETWEEN -100 AND 100

Döner AÇIKLAR:

id  select_type  table        type  possible_keys                                    key                  key_len  ref     rows  Extra
----------------------------------------------------------------------------------------------------------
1   SIMPLE       homes        ref   geolat,geolng,display_status                     display_status       1        const   2     Using where
1  SIMPLE        home_photos  ref   home_id,home_photo_type_id,home_photo_group_id   home_photo_group_id  4        homes.primary_photo_group_id   4

Oldukça komutu AÇIKLAR okumayı anlamıyorum. Bu iyi ya da kötü görünüyor. Şu anda geolat ve geolng için Bileşik Endeksi kullanıyorum. Olmalıdır?

CEVAP
1 Aralık 2009, Salı


Bu fayda sorguları kullanırken Bileşik Endeksi kullanmalısınız. Buna benzeyen bir bileşik dizini:

index( column_A, column_B, column_C )

katılmak için bu alanları kullanan bir sorgu yarar, filtreleme, ve bazen de seçme. Ayrıca kompozit sütun sol en alt kümeleri kullanan sorguları yararlanacaktır. Yukarıdaki dizin de sorgular bu ihtiyacı tatmin eder

index( column_A, column_B, column_C )
index( column_A, column_B )
index( column_A )

Ama (en azından doğrudan değil, belki daha iyi bir endeks ise orada kısmen yardımcı olabilir) ihtiyaç sorguları için yardımcı olacaktır

index( column_A, column_C )

Column_B eksik olduğuna dikkat edin.

Orijinal örnekte, iki boyut için Bileşik Endeksi çoğunlukla boyutları veya kendisi tarafından en soldaki boyut hem de, ama kendisi tarafından en sağdaki boyutu değil, sorgu sorguları yararlanacaktır. Eğer her zaman iki boyutlu sorgulama iseniz, Bileşik Endeksi gitmek için bir yoldur, gerçekten ilk (büyük ihtimalle) olan önemi yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • katherine gomez

    katherine go

    1 Aralık 2011
  • The Brister

    The Brister

    10 ŞUBAT 2008