MySQL建立索引注意事项以及面试问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haoshuai2015/article/details/80326390
Mysql是我们常用的数据库,其中建表建索引是实际项目开发过程中不可避免的操作,下面整理一下自己查阅的资料,简单的介绍一下mysql建索引的注意事项,方便自己理解,也可用于某些面试问答。
1. 索引的作用:
可以快速找出在某个列中有一特定值的行。不适用索引的话,MySQL会从第一条记录开始然后读取整张表直至找到相关行。即快速定位。
类同于我们阅读书籍的目录。
2.索引是否越多越好?(面试问答)
大多数情况下索引能大幅度提高查询效率,但是:
数据的变更(增删改)都需要维护索引,因此越多意味着维护成本越高;
更多的索引意味着需要更多的空间(一本书半本目录?);
过小的表,建索引可能会更慢;

3. 什么情况下应不建或少建索引
  表记录太少 
  如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。 
  如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。如:select * from zl_sybm where sydw_bh=’5401’(对sydw_bh建立索引不会产生性能优化) 
  经常插入、删除、修改的表 
  对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。 
  数据重复且分布平均的表字段 
  假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。 
  经常和主字段一块查询但主字段索引值比较多的表字段 
  如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作 标志来具体查询某一笔收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收费序号索引就已 经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。

以上,简而言之,就是:
一般来说,列的值唯一性太小(如性别,类型什么的),不适合建索引;
太长的列,可以选择只建立部分索引,(如:只取前十位做索引);
更新非常频繁的数据不适宜建索引

4.哪些情况不能用索引
  • like “%xxx”
  • not in , !=
  • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
  • WHERE index=1 OR A=10

5.如何查看, 分析索引信息?
show index from tablename;
explain select ……;
explain在phoenix中亦可同样使用

另外,下面是面试中MySQL常见问题总结的链接,来自博客专家derrantcm

点击打开链接 https://blog.csdn.net/derrantcm/article/details/51534411【面试】【MySQL常见问题总结】

以及Mysql性能优化的经验,来自博客专家lazytest
点击打开链接 https://blog.csdn.net/kaka1121/article/details/53395587  MySQL性能优化的最佳21条经验
阅读更多
换一批

没有更多推荐了,返回首页