Индекси
Случај 1
Погледот служи за да ги пронајдеме 20-те најпродавани продукти во изминатата недела. Овој поглед би можел да се користи кога секој корисник ќе ја отвори почетната страна на апликацијата, да му ги прикажеме најпродаваните продукти изминатата недела. Бидејќи во погледот се прават поврзувања со неколку табели, креирани се неколку индекси кои би го убрзале процесот на извршување на прашалниците поврзани со овој поглед:
- Креиран е индекс на product_id во order_details табелата
- Креиран е индекс na order_id во order_details табелата
- Креиран е индекс на date во order табелата
Сите индекси се од тип B-tree. Ако ја погледнете дефиниција на погледот и планот на извршување на прашалниците (сликa View и слика Explain Plan – Before Index), ќе видите дека не се користат никаде индекси при спојување на соодветните табели, а ако го погледнете планот на извршување на прашалникот после индексите (слика Explain Plan – After Index), ќе видите дека се користат индекси при спојување на соодвените табели. Сите индекси се од тип B-tree, затоа што првите два индекси се колони во кои имаме број(integer), при што за такви колони најсоодветен е B-tree индексот. За третиот индекс е искористен B-tree индексот, затоа што во самиот поглед внатре имаме филтер преку кој кажуваме да се најдат најпродаваните продукти во изминатата недела, филтерот е date колоната од orders табелата и тука филтерот е некој ‘date range’, при што за вакви филтри најсоодветен е исто така B-tree индексот. Погледот е комплексен, при што кога ќе извршиме прашалник за овој поглед, времето на извршување е 15 секунди (слика Select – Before Index), пред да додадеме индекси, додека откако додадовме индекси времето на извршување е 6 секунди (слика Select – After Index).
- Слика 1 - Поглед (View)
- Слика 2 - План за извршување на прашалникот пред индекси (Explain Plan - Before Index)
- Слика 3 - Извршување на прашалникот пред индекси (Select - Before Index)
- Слика 4 - Додавање на индекси (Indexes)
- Слика 5 - План за извршување на прашалникот после индекси (Explain Plan - After Index)
- Слика 6 - Извршување на прашалникот после индекси (Select - After Index)
Случај 2
Погледот служи за да ги пронајдеме категориите за секој клиент од кои највеќе купувал продукти. Овој поглед би можел да се користи за да му предложуваме продукти од соодвените категории на клиентот или да ставаме реклами за соодвените категории. За овој поглед филтерот би бил user_id, за да најдеме за секој клиент од кои категории највеќе купувал продукти. Бидејќи во погледот се прават поврзувања со неколку табели, креирани се неколку индекси кои би го убрзале процесот на извршување на прашалниците поврзани со овој поглед:
- Креиран е индекс на product_id во order_details табелата (постои од претходно)
- Креиран е индекс na order_id во order_details табелата (постои од претходно)
- Креиран е индекс на user_id во order табелата
- Креиран е индекс на category_id во product табелата
Сите индекси се од тип B-tree. Ако ја погледнете дефиниција на погледот и планот на извршување на прашалниците (сликa View и слика Explain Plan – Before Index), ќе видите дека се користат индекси на спојувањето со табелата order_details бидејќи тие индекси се креирани за друг поглед, а ако го погледнете планот на извршување на прашалникот после индексите (слика Explain Plan – After Index), ќе видите дека се користат и новите индекси за спојување со таблите order и category. Сите индекси се од тип B-tree, затоа што сите индекси се колони во кои имаме број(integer), при што за такви колони најсоодветен е B-tree индексот. Иако филтерот за погледот е user_id, најсоодветен индекс за вакви пребарувања е B-tree индексот. Погледот е комплексен, при што кога ќе извршиме прашалник за овој поглед, времето на извршување е 2 секунди и 677 милисекунди (слика Select – Before Index), пред да додадеме индекси, додека откако додадовме индекси времето на извршување е 129 милисекунди (слика Select – After Index).
- Слика 1 - Поглед (View)
- Слика 2 - План за извршување на прашалникот пред индекси (Explain Plan - Before Index)
- Слика 3 - Извршување на прашалникот пред индекси (Select - Before Index)
- Слика 4 - Додавање на индекси (Indexes)
- Слика 5 - План за извршување на прашалникот после индекси (Explain Plan - After Index)
- Слика 6 - Извршување на прашалникот после индекси (Select - After Index)
Потенцијални индекси
Овој поглед служи за да ги добиеме сите продукти. Во овој поглед филтри би можеле да бидат неколку колони:
- Category_name – кога пребаруваат продукти според категорија
- Supplier_name – кога пребаруваат продукти според добавувач
- Name – кога пребаруваат продукти според име
Извршувањето на сите прашалници поврзани со овој поглед се доста брзи (помалце од 300 милисекунди), при што немаме креирано нови индекси за овој поглед. Доколку во некој момент, прашалникот би се извршувал поспоро, би можеле да креираме индекси на неколку колони:
- Индекс на category_id во product (веќе постои од претходно)
- Индекс на supplier_id во product
- Индекс на product_id во product_price
- Индекс на product_id во product_property
- Индекс на property_id во product_property
- Индекс на name во product
Сите предложени индекси освен последниот би биле од тип B-tree затоа што колоните се број(integer), додека пак индекс за name колоната во product табелата би бил од тип GIN индекс, бидејќи тој е најсоодветен кога имаме пребарување од тип ‘full-text search’. Исто така, треба да внимаваме да не креираме премногу индекси во една табела, за да не дојде до успорување на извршувањето на прашалниците за таа табела, да не ги успориме операциите за внесување,бришење и промена на редови за таа табела и да не зафатиме премногу простор од дискот.
Овој поглед служи за да ги добиеме сите нарачки или нарачки за соодветен клиент. Во овој поглед филтер би бил само колоната user_id, кога некој клиент ќе побара да ги види своите нарачки, додека пак филтерот за end_date служи само за да ја земеме последната валидна цена за секој производ. Извршувањето на сите прашалници поврзани со овој поглед се доста брзи (помалце од 300 милисекунди), при што немаме креирано нови индекси за овој поглед. Доколку во некој момент, прашалникот би се извршувал поспоро, би можеле да креираме индекси на неколку колони:
- Индекс на user_id во address
- Индекс на user_id во orders (веќе постои од претходно)
- Индекс на order_id во order_details (веќе постои од претходно)
- Индекс на product_id во order_details (веќе постои од претходно)
- Индекс на product_id во product_price
- Индекс на product_id во product_property
- Индекс на property_id во product_property
Сите предложени индекси освен последниот би биле од тип B-tree затоа што колоните се број(integer). Исто така, треба да внимаваме да не креираме премногу индекси во една табела, за да не дојде до успорување на извршувањето на прашалниците за таа табела, да не ги успориме операциите за внесување,бришење и промена на редови за таа табела и да не зафатиме премногу простор од дискот.
Attachments (14)
- View.JPG (32.1 KB ) - added by 8 months ago.
- Select - Before Index.JPG (19.6 KB ) - added by 8 months ago.
- Select - After Index.JPG (19.2 KB ) - added by 8 months ago.
- Indexes.JPG (21.1 KB ) - added by 8 months ago.
- Explain Plan - Before Index.JPG (76.6 KB ) - added by 8 months ago.
- Explain Plan - After Index.JPG (75.7 KB ) - added by 8 months ago.
- View 1.JPG (35.8 KB ) - added by 8 months ago.
- Select - Before Index 1.JPG (19.8 KB ) - added by 8 months ago.
- Select - After Index 1.JPG (19.0 KB ) - added by 8 months ago.
- Indexes 1.JPG (12.0 KB ) - added by 8 months ago.
- Explain Plan - Before Index 1.JPG (85.6 KB ) - added by 8 months ago.
- Explain Plan - After Index 1.JPG (93.0 KB ) - added by 8 months ago.
- View 2.JPG (20.8 KB ) - added by 8 months ago.
- View 3.JPG (22.0 KB ) - added by 8 months ago.
Download all attachments as: .zip