本文主要对索引的创建及使用做详细描写叙述,至于为什么要使用索引、使用索引带来哪些优点、索引的分类等内容这里不再赘述,假设想知道请參考相关文档。
一、怎样正确的创建索引
1、对主键、外键 建立索引
因为开发中常常通过主键或者外键去查找某条或者多条记录,所以须要对主键、外键建立索引
2、对于常常出如今查询条件中的字段建立索引
对于常常出如今查询条件中的字段建立索引往往能提高查询效率
3、结合须要返回的字段创建索引
对于须要查询结果返回的字段建立组合索引能够不用查询数据表就能够得到数据。比如:select id,name,code from student where id=? 。假设对id,name,code建立索引的话,直接查询索引表就能够得到想要的数据了,这时就不用再訪问student表。
创建索引的经常使用注意事项有这么几个。创建索引当然不是越多越好。假设创建索引不当,还会导致查询效果比没有创建索引还低,或者索引表的数据比数据表的数据还大,所以使用须要须要小心慎重。
下边给出一个索引创建指引表:
|
字段类型 |
常见字段名 |
须要建索引的字段 |
主键 |
ID,PK |
外键 |
PRODUCT_ID,COMPANY_ID,MEMBER_ID,ORDER_ID,TRADE_ID,PAY_ID |
|
有对像或身份标识意义字段 |
HASH_CODE,USERNAME,IDCARD_NO,EMAIL,TEL_NO,IM_NO |
|
索引慎用字段,须要进行数据分布及使用场景具体评估 |
日期 |
GMT_CREATE,GMT_MODIFIED |
年月 |
YEAR,MONTH |
|
状态标志 |
PRODUCT_STATUS,ORDER_STATUS,IS_DELETE,VIP_FLAG |
|
类型 |
ORDER_TYPE,IMAGE_TYPE,GENDER,CURRENCY_TYPE |
|
区域 |
COUNTRY,PROVINCE,CITY |
|
操作人员 |
CREATOR,AUDITOR |
|
数值 |
LEVEL,AMOUNT,SCORE |
|
长字符 |
ADDRESS,COMPANY_NAME,SUMMARY,SUBJECT |
|
不适合建索引的字段 |
描写叙述备注 |
DESCRIPTION,REMARK,MEMO,DETAIL |
大字段 |
FILE_CONTENT,EMAIL_CONTENT |
二、怎样正确的使用索引
1、避免在where 子句中对字段进行is null 推断。这样将使引擎放弃使用索引而是全表扫描数据
2、避免在where子句中对字段进行不等潘丹(<>、 !=)。否则相同使用引擎全表扫描
3、避免在where子句中对字段进行or,in 推断。相同导致引擎全表扫描数据
建议使用union取代,例如以下样例,前提是code是索引
不建议使用的语句:select id from student where code = ‘000012‘ or code = ‘000015‘
建议使用的语句: select id from student where code = ‘000012‘ union all select id from student where code = ‘000015‘
4、避免在where 子句中对字段进行not in,not exists 的推断,相同导致索引失效
5、避免在where子句中对字段进行表达式操作(函数算法计算)。相同导致索引失效
比如:select id from student where DATEDIFF(SYSDATE,createDate) > 30
select id from student where col/2 =15
6、使用Like时,避免使用非字母开头检索
比如:select id from student where name like ‘%王%‘ 应该使用select id from student where name like ‘王%‘
7、在使用索引字段作为条件时。假设该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才干保证系统使用该索引,否则该索引将不会被使用,而且应尽可能的让查询字段顺序与索引顺序相一致。
PS:上边标注红色的第三条为五六年前数据库运行的标准。如今数据库一般都支持对in 或者 or 的索引查询。