mysql创建索引

VPS系统后台性能优化实战

自闭症网瘾萝莉.ら 提交于 2019-12-05 23:40:46
2019年开始,新东方APP团队启动了长达半年以上的稳定性建设工作,为什么稳定性如此重要?因为随着每年30%以上的高速增长,现有的后端服务完全扛不住日益增多的用户带来的高并发,高可用场景。所以优化工作势在必行。 如果你是一名java程序员的话,相信你也会很清楚,有时候,在研发功能的时候,仅仅是贴着产品的需求在做开发,功能是都实现了,但是没有考虑到功能在高并发下面是否可用,响应是否及时。这就给以后的线上运行留下很多隐患。 我们做稳定性建设的原因就是要解决这些隐患,提高系统稳定性,提高单台机器的QPS性能。加快接口响应速度,优化数据库的sql查询。 下面看一下优化后的效果图: 以上是单独一台服务器的吞吐率和响应时间曲线图,从图中可以看到,暑期吞吐率增长5倍,服务响应时间从最长的50多秒大幅度减少到0.4秒。优化效果明显。 以下从3方面阐述优化方法: 1、如何定位后端问题 2、如何解决数据库问题 3、如何分析和解决程序问题 一、定位后端问题的方法: kibana 。可以还原线上有问题的接口的参数列表(实时性比较好,统计多台服务器的日志,统一处理)。 听云 用听云监测慢事务,慢接口比较详细,能准确定位接口是sql慢,还是代码哪里慢。 二、数据库知识点和优化 1、2种存储引擎 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的

MySQL批量SQL插入各种性能优化

北慕城南 提交于 2019-12-05 20:47:59
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久。因此,优化数据库插入性能是很有意义的。 经过对MySQL innodb的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考。 1. 一条SQL语句插入多条数据。 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1); 修改成: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1); 修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因是合并后日志量

MySQL批量SQL插入性能优化

删除回忆录丶 提交于 2019-12-05 20:46:50
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,可能每天花费在数据导入上的时间就会长达几个小时之久。因此,优化数据库插入性能是很有意义的。 网络上的牛人很多,总会有一些手段可以提高insert效率,大家跟我一起分享一下吧: 1. 一条SQL语句插入多条数据。 我们常用的插入语句大都是一条一个insert,如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0); INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('1', 'userid_1', 'content_1', 1); 现在我们将它修改成: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1); 【数据对比】 下面是网上牛人提供一些测试对比数据

mysql 慢查询优化

夙愿已清 提交于 2019-12-05 20:12:25
# ### part1 : sql语句优化 # (1) mysql 执行流程 客户端: 发送链接请求,然后发送sql语句 服务端: 1.连接层: 提供和客户端链接的服务 show processlist;查看所有登录到mysql的用户 2.服务器: (1)提供各种用户使用的接口(增删改查) (2)提供sql优化器(mysql query optimizer) (发现sql语句执行效率非常慢,会经过优化器优化,然后把优化的结果进行执行) 3.存储引擎: 把得到的数据进行保存, innodb : 支持事务处理,支持行锁,支持高并发 myisam : 支持表锁,不支持并发. 把数据存储在文件或者内存当中 """ create table ceshi_table( id int primary key auto_increment, name varchar(255) )engine = myisam auto_increment=2 charset = utf8; """ 4.文件和日志 产生日志文件 binlog 二进制文件 # (2) sql 卡顿原因 硬盘读写数据,io延迟高,sql语句性能低,索引失效,导致sql执行时间长 编写过程: select .. from .. join on where .. group by .. having .. order by limit

【Mysql】-- sql优化技巧

混江龙づ霸主 提交于 2019-12-05 19:49:48
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 5.in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3 6.下面的查询也将导致全表扫描: select

mysql的简单命令

情到浓时终转凉″ 提交于 2019-12-05 19:25:22
MySQL的命令介绍: 连接数据库服务器命令: mysql -u 用户名 -p 密码 mysql是连接MySQL数据库的命令 -u表示后跟用户名 -p 后跟密码 如果登录后展示 "mysql >"表示登录成功 退出数据库命名: quit; 或者 exit; (注意MySQL以“;”结束一个语句)。 1、库相关的命令操作: 1.1、查看所有的库sql: show databases; 1.2、创建数据库的SQL: create database database_name; eg:创建一个名为test1的数据库 1.3、删除数据的SQL: drop database database_name; 1.4、选择数据库的SQL:(多个数据库下,选择要使用的) use database_name; 1.5、展示当前库下的所有的表SQL: show tables; 2、表操作 2.1、创建表 create table table_name( 属性名 数据类型[完整性约束], 属性名 数据类型[完整性约束], ... 属性名 数据类型[完整性约束] ); 注意:在数据库创建的时候要选取合适的数据类型,而且 还要添加完整性约束,两个属性之间用逗号隔开, 完整性约束条件有: ------------------------------------- 约束条件 | 说明 primary key |

触发器权限存储引擎等~

痞子三分冷 提交于 2019-12-05 17:46:45
关于mysql的笔记 触发器,存储过程 mysql用户,权限 存储引擎 缓存,索引 官网链接 https://dev.mysql.com/ mysql https://mariadb.com/ mariadb 触发器 TRIGGER 触发形式:事件 创建权限:root用户 查看:show triggers 删除: drop trigger trigger_name CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body # CREATE TRIGGER 触发器名称 事件前后 触发条件ON 触发表(不是被触发的表) FOR EACH ROW 触发事件 存储过程 PROCEDURE 提前编译完成后的方法,提高运行速度和降低网络传输大小 CREATE PROCEDURE sp_name ( [IN|OUT|INOUT]) begin 中间代码 end 查看存储过程列表 SHOW PROCEDURE STATUS; 查看存储过程的定义 SHOW CREATE PROCEDURE sp_name; 调用 CALL sp_name(更具定义决定是否带参数) 删除存储过程 DROP PROCEDURE sp_name 简单描述一下

Solr6.3服务并从Mysql上导入数据

不羁岁月 提交于 2019-12-05 14:32:19
安装好solr6.3服务,我安装在centos7系统中,在/opt目录下 步骤1: 创建一个core,这里用hubin为例 步骤2: 把mysql所需的jar包(mysql驱动包mysql-connector-java-5.1.38.jar)和solr-6.3.0/dist下的solr-dataimporthandler-6.3.0.jar和solr-dataimporthandler-extras-6.3.0.jar都复制到项目/opt/solr-6.3.0/server/solr-webapp/webapp/WEB-INF/lib/下。然后在solrconfig.xml文件中加入<lib dir="/opt/solr-6.3.0/server/solr-webapp/webapp/WEB-INF/lib/" regex=".*\.jar" />(就是把WEB-INF\lib里面的jar包配置到项目中,我这里用的是绝对地址。这段代码大约在solrconfig.xml的70多行处,前面有一堆类似的代码。) 步骤3: 在MYSQL中新建一张表。我这里用的是Navicat管理工具进行创建的。这里的表名是 goods 。字段如下图所示: 步骤4: 在solrconfig.xml的 <requestHandler name="/select" class="solr

mysql 索引的用法

纵然是瞬间 提交于 2019-12-05 14:29:36
1、索引概述 mysql的索引分为单列索引(全文索引,主键索引,唯一索引,普通索引)和组合索引。 单列索引:一个索引只包含一个列,一个表可以有多个单列索引。 组合索引:一个组合索引包含两个或两个以上的列, 1、查询当前表有哪些索引 show index from 表名 2、创建单例索引 create index 参考链接: https://blog.csdn.net/qq_36711757/article/details/80642931 来源: https://www.cnblogs.com/whstudyblog/p/11927833.html

mysql最左前缀原则

亡梦爱人 提交于 2019-12-05 14:20:21
为什么要有索引     假设我们要查找以下SQL语句,如果没有索引我们就会扫描整张物理表 SELECT `uid` FROM people WHERE lname`='Liu' AND `fname`='Zhiqun' AND `age`=26   假设建有单列索引index(lname),那么系统就会先到lname索引表中查找得到符合条件的people主键值,然后通过主键值扫描people表,进行剩下的匹配,这样就大大地提高效率。   为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。 索引的最左前缀原理:   通常我们在建立联合索引的时候,也就是对多个字段建立索引,相信建立过索引的同学们会发现,无论是oralce还是mysql都会让我们选择索引的顺序,比如我们想在a,b,c三个字段上建立一个联合索引,我们可以选择自己想要的优先级,a、b、c,或者是b、a、c 或者是c、a、b等顺序。为什么数据库会让我们选择字段的顺序呢?不都是三个字段的联合索引么?这里就引出了数据库索引的最左前缀原理。   比如:索引index1:(a,b,c)有三个字段,我们在使用sql语句来查询的时候,会发现很多情况下不按照我们想象的来走索引。比如以下两种情况 select * from table where c = '1'