فصل بیست و نهم :
INDEXES در SQLite
ایندکس ها جهت بهبود سرعت فرآیند جستجوی بروی رکورد ها ایجاد میشوند. ایندکس در دیتابیس خیلی شبیه ایندکسهای آخر کتابها هستند. بعنوان مثال فرض کنید می خاهید تمامی صفحاتی از کتاب را که در مورد موضوع و یا کلمه خاصی در انها بحث شده است را مشخص کنید. شما آن کلمه و یا موضوع را درج میکیند و آدرس صفحه هایی که در آنها از این کلمه استفاده شده است را نیز جلو ان ذکر میکیند. بنابراین کابر براحتی و بدون ایکه لازم باشد کل کتاب را برای آن کلمه بگردد یه راست به آن صفحه میرود.
اینکدس ها سلکت های ما را سریع میکنند در حالیکه عملیات INSERT و UPDATE ما را کند میکنند. ایندکس ها می توانند ایجاد و یا حذف شوند بدون اینکه بروی اطلاعات رکورد های موجود در جداول ما تاثیری اعمال شود.
ساخت ایندکس :
CREATE INDEX index_name ON table_name;
که در آن index_name نامیست که برای ایندکس مان استفاده میکینم .
Single-column Indexes
ایندکس هایی که تنها بروی یک ستون از جدول ما ساخته می شوند
CREATE INDEX index_name
ON table_name (column_name);
Unique Indexes
این نوع ایندکس ها فقط برای بهبود سرعت سرچ بکار نمیروند بلکه برای جامعیت دیتا (Data Integrity) نیز بکار میروند . این ایندکس ها جلو درج مقادیر تکراری ا در جداول میگیرند
CREATE UNIQUE INDEX index_name
on table_name (column_name);
Composite Indexes
این نوع ایندکس بروی چند ستون از جدول ما تنظیم می شود.
CREATE INDEX index_name
on table_name (column1, column2);
در ایندس گذاری باید به شروطی که در کوئری هایمان بعد از WHERE میگذاریم دقت کنیم و فیلد هایی را که بیشتر بروی انها می خواهیم فیلترینگ انجام دهیم را حال اگر یکی باشند و یا چند فیلد ، ایندکس گذاری میکینم.
Implicit Indexes
ایندکس هایی هستمند که بطور اتوماتیک توسط خود دیتابیس وقتی یک ابجکت ساخته می شود ، ایجاد میشوند . ان ایندکس ها هنگامی که یک قید Primary key ویا یک قید Unique ساخته میشود ، ایجاد میشوند.
مثال ذیل ایندکسی را بروی ستون SALARY از جدول COMPANY ما ایجاد میکند
sqlite> CREATE INDEX salary_index ON COMPANY (salary);
حال اگر بخواهیم لیست ایندکس های موجود در جدول COMPANYرا ببینیم :
sqlite> .indexes COMPANY
که نتیجه :
salary_index
sqlite_autoindex_COMPANY_1
می باشد که در آن sqlite_autoindex_COMPANY_1 در واقع ایندکس Implicitی است که دیتابیس بروی کلید اصلی ما ساخته است.
جهت لیست کردن تمامی ایندکس های موجود در یک دیتابیس از :
sqlite> SELECT * FROM sqlite_master WHERE type = 'index';
استفاده میکینم.
حذف یک ایندکس نیز همانند حذف سایر اشیائ دیتابیس با دستور DROP انجام میشود.
DROP INDEX index_name;
مثلا برای حذف ایندکسی که در مثال قبل ساختیم :
sqlite> DROP INDEX salary_index;
نکات بسیار مهم :
-
1. ایندکس ها نبایستی در جداول کوچک استفاده شوند (کوچک یعنی جداولی که رکورد های زیادی ندارند)
-
2. در جداولی که بایستی بروی انها حجم زیادی دیتا بصورت یکباره INSERT و یا UPDATE شود ، ایندکس نمی گذاریم.
-
3. ایندکس ها باسد بروی ستونهایی ایجاد شوند که دارای تعداد زیادی NULL هستند
-
4. ستونهایی که دائما دستخوش غیر میشوند را نباید ایندکس بگذاریم.
عبارت "INDEXED BY index-name" مشخص می کند که از ایندکس index-name جهت پرس و جوی دیتای آن جدول بایستی استفاده شود درحالیکه از عبارت "NOT INDEXED" مشخص میکند که در هنگام اجرای کوئری نباید از ایندکس index-name استفاده شود. همچنین ایندکس هایی که بطور ضمنی (Implicit) بوسیله قید های Unique و Primary Key ساخته میشوند نیز از این تنظیم پیروی میکنند و از آنها استفاده نمی شود
ولیکن primary key که از نوع Integer باشد علی رقم استفاده از "NOT INDEXED" همچنان برای جستجو بکار میرود
SELECT|DELETE|UPDATE column1, column2...
INDEXED BY (index_name)
table_name
WHERE (CONDITION);
همانطور که میبینید عبارت INDEXED BY برای SELECT , UPDATE و DELETE بکار میرود .
مثال :
فرض کنید می خواهیم بروی جدول COMPANY ایندکسی برای این مثال بسازیم:
sqlite> CREATE INDEX salary_index ON COMPANY(salary);
حالا :
sqlite> SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;
و نتیجه :
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
7 James 24 Houston 10000.0
2 Allen 25 Texas 15000.0
1 Paul 32 California 20000.0
3 Teddy 23 Norway 20000.0
6 Kim 22 South-Hall 45000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
مفاهیم و موضوعات این فصل عبارتند از :
-
INDEXES در SQLite
-
Single-column Indexes در SQLite
-
Unique Indexes در SQLite
-
Composite Indexes در SQLite
-
Implicit Indexes در SQLite