索引的建立與不走索引的情況總結
阿新 • • 發佈:2020-10-31
1.如果可以建立唯一鍵索引,就建立唯一鍵索引
2.為經常需要排序、分組和聯合操作的欄位建立索引
3.為常作為查詢條件的欄位建立索引
4.儘量使用字首索引
如果索引欄位的值很長,最好使用值的字首來索引。例如,TEXT和BLOG型別的欄位,進行全文檢索
會很浪費時間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度
5.限制索引的數目
索引的數目不是越多越好。每個索引都需要佔用磁碟空間,索引越多,需要的磁碟空間就越大。
修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。
6.刪除不再使用或者很少使用的索引
表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理
員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。
#查詢所有資料
mysql> explain select * from city;
#刪除索引,然後查詢
mysql> alter table city drop index District_key;
mysql> explain select * from city where District='heilongjiang';
#表中資料一共4079,查詢資料539條,走索引 13.2%
mysql> explain select * from city where population > 500000;
#表中資料一共4079,查詢資料737條,不走索引 18%
mysql> explain select * from city where population > 400000;
反覆插入刪除容易損壞索引
#運算子號如果在等號左邊,則不走索引
mysql> explain select * from city where id-1=2;
#運算子號如果在等號右邊,則走索引
mysql> explain select * from city where id=2 +1;
# 1.建表
mysql> create table phone(id int,name varchar(10),number varchar(20));
#2.建立索引
mysql> alter table phone add unique key uni_key(number);
#3.插入資料
mysql> insert phone values(1,'警察局',110),(2,'消防',119),(3,'醫院',120);
#4.測試查詢資料是否走索引
1)不走索引
mysql> explain select * from phone where number=120;
2)走索引
mysql> explain select * from phone where number='120';
#因為120存到資料庫中的欄位是字元型別,那麼查詢時字元型別必須加引號
#1. % 在最前面時不走索引
mysql> explain select * from city where countrycode like '%H';
mysql> explain select * from city where countrycode like '%H%';
#2. % 在後面時走索引
mysql> explain select * from city where countrycode like 'H%';
#3. % 在中間時也走索引
mysql> select * from city where countrycode like 'C%N';
#0.檢視聯合索引
mysql> show index from user;
+-------+------------+-----------+--------------+-------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+-------+------------+-----------+--------------+-------------+
| user | 1 | index_all | 1 | sex |
| user | 1 | index_all | 2 | age |
| user | 1 | index_all | 3 | money |
| user | 1 | index_all | 4 | look |
+-------+------------+-----------+--------------+-------------+
#1.只要包含排第一的欄位條件,就走索引
mysql> select * from user where sex='fmale' and age='30';
mysql> explain select * from user where age='30' and money='100000000' and look='beautiful' and sex='fmale';
#2.不包含建立聯合索引排第一的欄位時,不走索引
mysql> explain select * from user where age='30' and money='100000000' and look='beautiful';
mysql> explain select * from phone where number not in (110);
mysql> explain select * from phone where number <> '110';