Əsas səhifə > Performance tests and tips > Prefix indexes vs. Full indexes (performance test)

Prefix indexes vs. Full indexes (performance test)

Artıq bir neçə dəfə query performansının aşağı olmasının səbəbini index-ləmədə buraxılan səhvlərdə tapıram.
google-dan copy-paste etdikdən sonra düzgün işləyən query-i 2 qat zəifləməsin nə etsin?😉
Kiçik index həmişə yaxşıdır deyə bir şey yoxdur. Lütfən hər hansı bir dəyişiklik etməmişdən əvvəl dəfələrlə test edin.

Full index : bütöv bir column-u index-ləmək.
Prefix index: yalnız müəyyən leftmost hissəni index-ləmək.

Təbii ki bəzən prefix index-lərin faydası olur lakin faydasından çox ziyanı da ola bilər, bunu da indi test edəcik.
Çox böyük cədvəl götürmürəm indiki halda 128.400 row-su olanla başlamaq olar. Sizin əlinizdə daha böyük data-lı cədvəl varsa test edin və əlavələri sizin müəllifliyiniz altında yazıya elavə edim.

Nümunə cədvəlimiz city-dir.

CREATE TABLE `city_demo` (
  `city` varchar(26) NOT NULL,
 )

Test without index:

select * from city_demo;

Time: 0.1018

Test with full index:

alter table city_demo add index(city);
select * from city_demo;

Time: 0.0829

Test with prefix index:

alter table city_demo drop index city;
alter table city_demo add index(city(7));
select * from city_demo;

Time: 0.1035

Indi isə diqqət edin. index-siz select* = prefix indexli select * . QEP(query execution plan)-e baxdıqda da görərik ki, hər iki query üçün full table scan müşahidə olunur. Dolayısı ilə biz bu prefix index-i boş yerə əlavə etmiş oluruq.
Testə davam edək.
Test without index:

select city from city_demo where city like 'Sa%';

Time: 0.0753

Test with full index:

alter table city_demo add index(city);
select city from city_demo where city like 'Sa%';

Time: 0.0101

Test with prefix index:

alter table city_demo drop index city;
alter table city_demo add index(city(7));
select city from city_demo where city like 'Sa%';

Time: 0.0249

Nisbətən yaxşıdır lakin yenə də full index-dən daha zəifdir. Əvvəlkinə baxdıqda indi deyə bilərik ki, bəli prefix index effektiv olaraq istifadə olundu lakin performance-ı 0.01 qədər daha aşağı oldu.

Nəticə: Prefix index sizə daha çox mb qazandıracaq. Yəni, varchar(20) üçün full index 22 byte, index(7) isə 9 byte yer tutmuş olacaq. Lakin mb qazanmaq niyyəti ilə query-ni zəiflətmə riskiniz var. Bundan əlavə Prefix İndex-li column-u Order by və Group by-da həmçinin “İndex Covering”-də istifadə etmək olmur. Dolayısı ilə Prefix index-dən çox ehtiyatla və test edərək istifadə etmək lazımdır.

Deyək ki siz düşündünüz ki, prefix index sizə tam uyğundur və hər şeyi nəzərə aldınız. Ən uyğun uzunluğu (yəni add index(city(x))) necə hesablamalıyıq. Bunun qəşəng çox sadə bir üsul var. Bunun üçün ilk öncə ən çox təkrarlanan şəhərləri tapırıq:

mysql> SELECT COUNT(*) AS cnt, city
    -> FROM city_demo
    -> GROUP BY city
    -> ORDER BY cnt DESC
    -> LIMIT 10;
+-----+----------------------------+
| cnt | city                       |
+-----+----------------------------+
| 425 | London                     |
| 223 | Mysore                     |
| 222 | Livorno                    |
| 220 | Santiago de los Caballeros |
| 220 | Acua                       |
| 220 | Ashgabat                   |
| 219 | Miyakonojo                 |
| 219 | Kimberley                  |
| 219 | Halisahar                  |
| 219 | Daugavpils                 |
+-----+----------------------------+
10 rows in set (0.16 sec)

Əgər fikir verdinizsə bütün qiymətlər 220-420 arasındadır.
Daha sonra isə ən çox təkrarlanan prefix-ləri tapırıq. Bir neçə dəfə test etdikdən sonra görmək olar ki, həqiqətən də 7 bizə ən uyğunudur:

mysql> SELECT COUNT(*) AS cnt,
    -> LEFT(city,7) AS pref
    -> FROM city_demo
    -> GROUP BY pref
    -> ORDER BY cnt DESC
    -> LIMIT 10;
+-----+---------+
| cnt | pref    |
+-----+---------+
| 435 | Santiag |
| 434 | Valle d |
| 430 | San Fel |
| 425 | London  |
| 223 | Mysore  |
| 222 | Livorno |
| 220 | Ashgaba |
| 220 | Acua    |
| 219 | Nha Tra |
| 219 | Konotop |
+-----+---------+

220-430 arası dəyişir. Yəni təqribən bərabərdir.

Prefix index-in performance təsirini ölçmək üçün siz də öz data-nızla testlər edin və onu bizimlə paylaşın.
Təşəkkürlər😉

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: