针对数据库索引的优化
本文主要对索引的创建及使用做具体描述,至于为什么要使用索引、使用索引带来哪些好处、索引的分类等内容这里不再赘述,如果想知道请参考相关文档。 一、如何正确的创建索引 1、对主键、外键 建立索引 由于开发中经常通过主键或者外键去查找某条或者多条记录
本文主要对索引的创建及使用做具体描述,至于为什么要使用索引、使用索引带来哪些好处、索引的分类等内容这里不再赘述,如果想知道请参考相关文档。
一、如何正确的创建索引
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 的索引查询。