首页 > 数据库 >一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

时间:2023-04-05 15:05:14浏览次数:40  
标签:Web 建立 数据库 查询 索引 数据量 MySQL Data


先大致介绍下项目的数据库信息。

数据库A:主要存放的通用的表,如User、Project、Report等。

数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。

数据库表的特点

A中的表:数据量几乎都比较小,比如User表中用户数,顶多也就几百上千。

B中的表:X/Y/Z 3张表几乎是确定的,Data表 中的数据量比较大,几千万到上亿。

周期性的会加入一大批数据,比如,每月末增加几百万条数据。

即一般情况下,B中的表只有查询操作,而且特别是Data查询频繁且数据量很大。

建立索引

1.为所有的表建立了唯一索引,索引字段是主键id。

2.考虑到数据库A中表的数据量很小,暂时没有建立组合索引。

如有可能,对频繁查询的表和字段,后期尝试加入组合索引。

3.对Data表建立组合索引。

频繁查询的一条SQL语句

select  from Data where projectId=? and (inputVersion in (201)) and (sideId in (10001)) and (breakId in (?)) and (periodId in (?))  order by id desc;

建立组合索引的语句
ALTER TABLE Data ADD INDEX data_query_index (projectId,inputVersion,sideId,breakId,periodId);

建立索引之前,需要花费2.796秒。

建立索引之后,只需要0.136秒。

可以说是,大幅度提升了查询效率。

索引的弊端

随之而来的问题:如果已经建立了索引,那么批量增加数据的时候,会特别慢。

一种较快的方法是:批量插入数据之前,先删除索引,提高批量插入数据的效率。
然后,再重新建立索引,提高查询效率。

1000万条记录,重建5个字段的组合索引需要2到3秒。

重建索引的问题是,这个过程中,查询会比较慢。

应对之策:导入数据,重建索引 应该选择 晚上/凌晨等用户较少使用系统的时间段。

一个建议
 用 explain sql;
 可以分析sql语句的执行情况,进而对sql语句进行优化。

天下武功,唯勤不破

性能优化,以前只是看过一些书,没啥实践经验。

最近项目需要由我来进行优化,只好硬着头皮一点点去实践。

网上搜资料、请教同事、请教大牛。

周末再多看看书,认真复习和学习Linux、MySQL、Tomcat、Redis等一大堆,先侧重系统优化。
 

 

标签:Web,建立,数据库,查询,索引,数据量,MySQL,Data
From: https://blog.51cto.com/fansunion/6171056

相关文章

  • Ubuntu10.04下配置和使用JDK-Mysql-Tomcat-SVN
    操作系统:Linux-Ubuntu10.0.4,JDK:1.61.安装JDK和设置Java环境变量1.1安装JDKa.下载JDKjdk-6u31-linux-x64.bin,具体下载哪个,根据自己的平台和系统来决定b.修改权限,增加可执行权限sudochmodu+xjdk-6u31-linux-x64.binc.进入到jdk-6u31-linux-x64.bin所在的目录./jdk-6u31-linux-x......
  • Web开发的那点事--数据持久层常用功能
    数据持久层--4类功能1.增加 增加一条记录-实体(有关联,没有关联) 2.修改 修改一个字段 修改多个字段 修改哪一列或哪些列:where一列多列 主键定位,多个列定位3.删除  物理删除:删除哪一列或哪些列  逻辑删除:本质是更新操作,修改isDeleted(对所有表的记录逻辑删除,几......
  • Web开发的那点事--高效之道
    --------------------目标------------------核心目标:提高公司和个人开发效率,降低测试时间,减少Bug。--------------------指标----------------开发效率:提高开发效率20%以上。容易测试:根据源码容易判断是否正确,或者容易看到运行时效果。容易理解:具有很好的可读性和可实践性。容......
  • Linux安装mysql数据库
    1.下载路径:https://dev.mysql.com/downloads/2.上传解压#tar-xvfMySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar3.安装#rpm-ivhMySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm--nodeps#rpm-ivhMySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm--no......
  • 最近遇到的若干Web前端问题:disable和readonly,JqueryEasyUI,KindEditor
     最近项目中用到了JqueryEasyui和KindEditor等框架组件,问题真不少啊~ 一些看起来很简单理所当然的事情,竟然花费了不少时间,才解决好~  1.readonly和disable的区别 readonly:只读,不可编辑,提交表单时,值会提交到后端。 disable:禁止(包含了“只读”......
  • java——maven——idea使用模板(骨架)创建maven工程——webapp(重点)
    黑马模板:                  本地:         ......
  • vue项目启动时 `webpack-dev-server –inline –progress –config build/webpack.dev
    vue项目在npmrundev时报错[email protected]:webpack-dev-server--inline--progress--configbuild/webpack.dev.conf.js解决这类问题主要分两种情况这个项目已经构建好的项目,你只是从git、snv或者其他地方引入,别人能运行你不能运行这是一个新构建的vue项目第一......
  • MySQL AutoIncrement--PXC集群批量插入操作获取自增ID异常问题
    问题描述由于MySQLPXC集群的所有节点均可读写,因此当PXC集群中节点增加和减少时,PXC集群会自动调整集群各节点的自增ID步长,避免不同集群节点生成相同自增ID值产生冲突。当PXC集群中读节点数量发生变化时,客户端执行BatchInsert方法可能返回错误的自增ID值。问题原因由于MySQL数......
  • mysql 分组查询
    创建表employeeCREATETABLE`employee`(`id`int(11)NOTNULL,`name`varchar(50)DEFAULTNULL,`gender`varchar(1)DEFAULTNULL,`hire_date`dateDEFAULTNULL,`salary`decimal(10,0)DEFAULTNULL,`performance`double(255,0)DEFAULTNULL,`......
  • web前端tips:CSS之sticky粘滞效果
    Sticky介绍Sticky是CSS3的一个定位属性,它可以让元素在滚动过程中“粘”在屏幕上的某个位置,直到滚动到某个临界点后才会跟随滚动。Sticky定位可以使得页面更具交互性和易用性,也提高了页面的可读性。Sticky定位可以通过以下代码实现:position:sticky;top:0;其中,top属性定义了......