设为首页 收藏本站
查看: 1321|回复: 0

[经验分享] mysql性能优化-索引优化

[复制链接]

尚未签到

发表于 2018-10-10 06:15:43 | 显示全部楼层 |阅读模式
  1、商业需求的影响
  Myisam存储引擎内置一个计数器,count(*)时直接从计数器读取;而通过innodb存储引擎查找某个数据时,是必须扫描全表的,所以当执行对表的统计(即使用count(*)函数)时,myisam要比innodb要快的很多。所以一般在innodb上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。
  2、系统架构及实现的影响
  以下几类数据不适合存放在数据库:
  ①二进制多媒体数据:包括图片、音频、视频和其他一些相关的二进制文件。
  ②超大文本数据:从5.0.3版本开始,varchar类型最大长度调整到64KB。
  3、查询语句对性能的影响
  最大的性能瓶颈就是在于磁盘IO。
  下面我们通过用explain来查看执行sql语句的行计划
DSC0000.jpg

  还可以打开mysql的profiling 功能,来查看sql的实际执行计划
DSC0001.jpg

  Explain与profiling的区别:
  Explain只是预计、估计、估算执行这个计划sql语句需要花费多长时间,并没有真正的执行;而profiling则是实际执行了该命令,后者的准确度更高。
  通过执行“SHOWPROFILE” 命令获取当前系统中保存的多个Query 的profile(配置文件)的概要信息。
DSC0002.jpg

  4、数据库schema(架构)设计对性能的影响
  5、硬件选择对性能的影响
  ①数据库主机IO性能是优先考虑的,IO性能主要是由磁盘、内存、网卡共同决定。
  ②数据库主机的CPU的处理能力也必须考虑。
  ③还要考虑网络设备(比如说路由器、交换机)。
  总结:四句话来概括:商业需求合理化、系统架构最优化、逻辑实现精简化、硬件设施理性化。
  二、MySQL性能优化之-索引
  说明:索引优化了查询,但是降低了增、改、删的效率。
  “Show index from   表名” 或者 “show  keys  from  表名” //查询一个表有哪些索引
  索引的指针类型于书本的目录页码。
  做一个简单测试,假如我们创建了一个tb1表,向表中插入20000行数据,表的创建和数据插入用如下脚本实现
DSC0003.jpg

  再手动插入一行数据:
DSC0004.jpg

  下面开始测试,查询stuname=’admin’的记录:
  情况1:stuname列上没有创建索引的情况
DSC0005.jpg

  情况2:stuname列上创建索引的情况再查询
DSC0006.jpg

  总结:在查找stuname="admin"的记录时,如果在stuname上已经建立了索引,MySQL无须任何扫描全表,即准确可找到该记录。相反,MySQL会扫描所有记录。
  所以在数据库表中,对字段建立索引可以大大提高查询速度。
  索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每种存储引擎的索引都不一定完全相同,并不是所有的存储引擎都支持所有的索引类型。
  什么是索引?
  索引能够帮助我们快速定位数据,可以提高查询的速度,它存在的形式是文件。
  这里主介绍B-tree索引的结构
DSC0007.jpg

  总结:B树索引又称平衡树索引。
  磁盘块I又称根节点。
  磁盘块包括数据项和指针。
  数据项类似于书本章节的标题;
  指针类似于书本章节所在的页码。
  真实的数据存放于叶子节点,非叶子节点不存储真实数据,只存储指引搜索方向的数据项和指针。
  索引对数据的排序只有升序和降序。
  为什么使用索引?
  索引可以让mysql高效运行,可以大大提高mysql的查询(包括排序,分组)效率;数据约束(唯一索引的建立)。
  索引给我带来什么好处?
  提高查询效率,快速定位数据。
  使用索引产生的代价?
  ①磁盘的开销
  ②写数据:需要更新索引,对数据库是个很大的开销,降低表更新、添加和删除的速度。
  不建议使用索引的情况:
  ①数据1000字以下的表不需要建索引
  ②一列中选择性较低的不建索引(比如这一列是性别的,可能的值只有男和女)(所谓索引的选择性,是指不重复的索引值与表记录数的比值,取值范围(0-1)。选择性越高,索引的价值越大)
  索引的类型?
  索引包括单列索引和组合索引。
  说明:单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
  1、 普通索引
  这是最基本的索引,它没有任何限制。
DSC0008.jpg

  2、 唯一索引
  它与前面的普通索引类似,不同的就是索引列的值必须唯一,但允许空值,空值是指null。如果是组合索引,组合列的值必须唯一
DSC0009.jpg

  主键索引:一种特殊的唯一索引,不允许有空值,一般在建表的时候自动建立主键索引。
DSC00010.jpg

  3、组合索引
  为了进一步提升MySQL的效率,就要考虑建立组合索引。
  例如:创建一个表,包含如下字段:
DSC00011.jpg

  将 username, city, age建到一个索引里:
DSC00012.jpg

  说明:如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于组合索引。虽然此时有了三个索引,但MySQL只能用到其中那个它认为似乎是最有效率的单列索引。
  建立一个这样的组合索引=其实是相当于分别建立了下面三组组合索引:
  usernname,city,age   usernname,city   username,没有 city,age这样的组合索引。
  Mysql组合索引遵循“最左前缀”原则。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引。
  下面的几个SQL就会用到这个组合索引:
DSC00013.jpg

DSC00014.jpg

  而下面几个则不会用到:
DSC00015.jpg

DSC00016.jpg

  如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。
DSC00017.jpg

  4、 全文索引(用的非常的少)
  只用于MyISAM表 对文本域进行索引。字段类型包括char、varchar、text
  不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
DSC00018.jpg

  查看索引:
DSC00019.jpg

  或者
DSC00020.jpg

  在什么情况下建立索引?
  一般来说,在WHERE和JOIN子句中出现的列需要建立索引。
  例如:在username上创建索引
DSC00021.jpg

DSC00022.jpg

  此时就需要对两个表的userame上建立索引。
  使用索引的注意事项
  ①在用like模糊查询时,以通配符%和_开头作查询时,MySQL不会使用索引,而是默认全表扫描。
  例如下句会使用索引:
DSC00023.jpg

  而下句就不会使用:
DSC00024.jpg

②不要在有索引的列上进行运算(运算:即使用函数,加、减、乘、除、统计等等)
DSC00025.jpg

  将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
DSC00026.jpg


  本文出自http://zpf666.blog.51cto.com/11248677/1911477


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619658-1-1.html 上篇帖子: 基于linux操作系统Mysql的基本操作(三) 下篇帖子: mysql兼mariadb安装过程详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表