mysql 性能优化
袋鼠mysql
中国分布式数据库领导者
展开
-
什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?
CREATE TABLE user_group (id int(11) NOT NULL auto_increment,uid int(11) NOT NULL,group_id int(11) NOT NULL,PRIMARY KEY (id),KEY uid (uid),KEY group_id (group_id),) ENGINE=InnoDB AUTO_INCREMENT...原创 2019-10-18 14:20:57 · 219 阅读 · 0 评论 -
mysql表优化、分析、检查和修复的方法 mysam引擎
本文实例讲述了mysql表优化、分析、检查和修复的方法。分享给大家供大家参考,具体如下: 这里介绍对数据库的管理常规就是进行预防性的维护,以及修复那些出现问题的内容。 进行检查和修复通常具有四个主要的任务: 1. 对表进行优化 2. 对表进行分析(分析并存储MyISAM和BDB表中键的分布) 3. 对表进行检查(检查表的错误,并且为MyISAM更新键的统计内容) 4. 对表进行修复(修...原创 2018-05-23 18:09:28 · 563 阅读 · 0 评论 -
MySQL查询语句中的IN 和Exists 对比分析
背景介绍 最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种方法的SQL都写出来对比一下执行效率,发现IN的查询效率比Exists高了很多,于是想当然的认为IN的效率比Exists好,但本着寻根究底的原则,我想知道这个结论是否适用所有场景,以及为什么会出现这个结果。 网上查了一下相关资料,大体可以归纳为:外部表小,内部表大时,适用Exists;外部表大,内部表小时,适用I...原创 2018-05-28 11:10:09 · 335 阅读 · 0 评论 -
高性能mysql之前缀索引
有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性...原创 2018-05-16 11:21:42 · 408 阅读 · 0 评论 -
MySQL清除表空间碎片
MySQL清除表空间碎片(对于Innodb 引擎的 共享空间:Innodb 共享空间自己试过就是清理不掉,所以对于Innodb 共享空间我的解决方法是把Innodb 修改成独立表空间)摘要:清除碎片操作会暂时锁表,数据量越大,耗费的时间越长,可以做个脚本,定期在访问低谷时间执行,例如每周三凌晨,检查DATA_FREE字段,大于自己认为的警戒值的话,就清理一次。 碎片产生的原因(1)表的存储会...原创 2018-05-16 10:54:09 · 609 阅读 · 0 评论 -
SQL语句常见优化十大案例
1、慢SQL消耗了70%~90%的数据库CPU资源; 2、SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低; 3、SQL语句可以有不同的写法;下面是我总结的一些SQL常见的优化方法,每个案例都简单易懂,在开发过程中可以作为参考: 1.不使用子查询 例:SELECT * FROM t1 WHERE id (SELECT id F...原创 2018-05-22 15:50:47 · 462 阅读 · 0 评论 -
mysql 优化in 和exists
in 和exists in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询。 一直以来认为exists 比in 效率高的说法是不准确的。如果查询的两个表大小相当,那么用in 和exists 差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如: 表A(小表),表B(大表)1:...原创 2018-05-22 15:23:09 · 1703 阅读 · 1 评论 -
MySQL如何利用索引优化ORDER BY排序语句
MySQL如何利用索引优化ORDER BY排序语句MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。通过索引优化来实现MySQL的ORDER BY语句优化:1、ORDER BY的索引优化。如果一个SQL语句形如: SELECT [colu...原创 2018-05-22 15:11:53 · 342 阅读 · 0 评论 -
MySQL单表百万数据记录分页性能优化 limit优化
背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schema SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname’ AND TABLE_...原创 2018-05-22 14:37:56 · 682 阅读 · 1 评论 -
MySQL锁定状态查看命令
1 show processlist;SHOW PROCESSLIST显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。如果有线程在update或者insert 某个表,此时进程的status为updating 或者 sendi...原创 2018-05-24 14:30:35 · 312 阅读 · 0 评论 -
mysql 优化之 in between and
SELECT * FROM a WHERE id IN (1,2,3,4,5,6,7…..100) 这个这种sql 怎么优化方法between andselect * from a where id >=1 and id <=100;改为列名name *select name from a where id >=1 and id <=10...原创 2018-05-24 15:13:27 · 8519 阅读 · 0 评论 -
左链接加右表 左右链接相反加
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。 一、导致SQL执行慢的原因 1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。 2.没有索引或...原创 2018-06-08 09:52:39 · 394 阅读 · 0 评论 -
记一次详细的的SQL查询经历,group by慢查询优化
一、问题背景现网出现慢查询,在500万数量级的情况下,单表查询速度在30多秒,需要对sql进行优化,sql如下:这里测试环境构造了500万条数据,模拟了这个慢查询。简单来说,就是查询一定条件下,都有哪些用户的。很简单的sql,可以看到,查询耗时为37秒。说一下app_account字段的分布情况,随机生成了5000个不同的随机数,然后分布到了这500万条数据里,平均来说,每个app_ac...原创 2019-09-27 22:50:58 · 3278 阅读 · 1 评论 -
Using index condition Using index
Using index conditionTables are read by accessing index tuples and testing them first to determine whether to read full tablerows. In this way, index information is used to defer (“push down”) readi...原创 2019-09-27 22:37:24 · 1855 阅读 · 0 评论 -
mysql range表分区
客服平台,线上查询存在性能问题,为了解决或者说是缓解这个问题,除了加必要的索引,另外就是将表进行分区。这里主要是针对既有的表进行分区,采用的是alter table xxx的方式,当然,也可以采用create table xxx partition by range(abc)的方式,都是可以的。两种方式,都验证和测试过,都可行!这里主要介绍alter的方式!主要是因为alter的过程,遇到一点...原创 2019-08-20 10:47:31 · 851 阅读 · 0 评论 -
SSD 下的 MySQL IO 优化
阅读这篇文章之前,读者需要注意的是,为了维护隐私,用 MySQL 服务器的 D 段代替完整 IP,并且略去一些私密信息。A 项目,因 I/O 出现规律性地剧烈波动。每 15 分钟落地一次,innodbBuffPoolPagesFlushed 参数监控波峰和波谷交替出现,磁盘 I/O 同样如此,并且 until 达到 100%。经过排查,排除了触发器、事件、存储过程、前端程序定时器、系统 cron...原创 2019-06-04 12:17:53 · 332 阅读 · 0 评论 -
InnoDB的锁机制深入理解
InnoDB的锁机制深入理解前言数据事务设计遵循ACID的原则。MySQL数据库提供了四种默认的隔离级别,读未提交(read-uncommitted)、读已提交(或不可重复读)(read-committed)、可重复读(repeatable-read)、串行化(serializable)。MySQL的默认隔离级别是RR。锁基本概念2.1 共享锁和排它锁InnoDB实现...原创 2019-05-09 15:34:56 · 512 阅读 · 0 评论 -
mysql查看死锁和解除锁
解除正在死锁的状态有两种方法:第一种:1.查询是否锁表show OPEN TABLES where In_use > 0;2.查询进程(如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程)show processlist3.杀死进程id(就是上面命令的id列)kill id第二种:1.查看下在锁的事务SELECT * FROM INFORMATION_SCHEM...原创 2019-04-24 15:20:17 · 561 阅读 · 0 评论 -
数据库SQL优化大总结之 百万级数据库优化方案
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中...原创 2019-04-23 15:55:06 · 179 阅读 · 0 评论 -
记一次Mysql占用内存过高的优化过程
一.环境说明: 操作系统:CentOS 6.5 x86_64 数据库:Mysql 5.6.22 服务器:阿里云VPS,32G Mem,0 swap二.问题情况: 1.某日发现公司线上系统的Mysql某个实例的从库长时间内存占用达到60%如下图 2.于是开始按照以下步骤排查: (1).查看mysql里的线程,观察是否有长期运行或阻塞的sql: show full process...原创 2018-07-27 10:17:01 · 16646 阅读 · 1 评论 -
数据库SQL优化大总结之 百万级数据库优化方案
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。一、百万级数据库优化方案1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2...原创 2018-05-22 11:34:03 · 267 阅读 · 0 评论 -
MySQL 索引管理与执行计划
阅读目录 •1.1 索引的介绍 •1.2 MySQL索引管理 •1.3 MySQL中的约束索引 •1.4 SQL语句优化 •1.5 用expain查看SQL的执行计划 •1.6 mysql不走索引的原因 •1.7 数据库索引的设计原则1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或...原创 2018-05-25 14:51:45 · 185 阅读 · 0 评论 -
用mysqlslap进行mysql压力测试
mysqlslap是mysql自带的工具,不需要单独安装:参数:-concurrency 代表并发数量,多个可以用逗号隔开,concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。--engines 代表要测试的引擎,可以有多个,用分隔符隔开。--iterations 代表要运行这些测试多少次。--auto-generate-sql原创 2018-01-03 14:56:01 · 774 阅读 · 0 评论 -
MySQL交换分区的实例详解
MySQL交换分区的实例详解前言在介绍交换分区之前,我们先了解一下 mysql 分区。数据库的分区有两种:水平分区和垂直分区。而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区。水平分区即:以行为单位对表进行分区。比如:按照时间分区,每一年一个分区等。在MySQL中,分区是可以交换的,可以将一个分区表中的一个分区和一个普通表中的数据互换。交换分区的实现1、交原创 2017-12-26 11:15:09 · 527 阅读 · 0 评论 -
MySQL对数据表已有表进行分区表
对现有的一个表进行创建分区表,并把数据迁移到新表,可以按时间来分区,然后这表不是实时更新,每天有一次插入操作。 时间比较充裕,但是服务器上有其他应用,使用较小资源为主要方式。操作方式@1 可以使用ALTER TABLE来进行更改表为分区表,这个操作会创建一个分区表,然后自动进行数据copy然后删除原表, 猜测服务器资源消耗比较大。类似操作ALTER TABLE tb转载 2017-12-26 10:55:13 · 1080 阅读 · 0 评论 -
Mysql各种索引区别
Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要占纸张的,而索引是要占磁盘空间的。Mysql索引主要有两种结构:B+树和hash.hash:hsah索引在mysql比较少用,他以把数据的索引以hash形式组织起来,因此当查找某一转载 2017-11-27 17:24:27 · 410 阅读 · 0 评论 -
MySQL索引浅谈
本文关于MySQL的讲述是基于MySQL标准版本,不能覆盖分支版本(比如MariaDB, Percona, XtraDB)中的特性,关于索引的所有讲述如果没有在特指的情况下都是基于InnoDB存储引擎的,文中所用的“优化”一词,更多的是一个参考,而非绝对,所有和优化相关的操作都离不开大量的数据样本,对应的性能指标定义,和无数次的调优方案尝试,调整。本文将“优化”定义为工作负载相同的情况下响原创 2017-11-27 14:23:51 · 442 阅读 · 0 评论 -
mysql5.7性能查询20个常用命令
mysql5.7性能查询20个常用命令原创 2017-12-14 16:50:06 · 4186 阅读 · 1 评论 -
MySQL 慢日志分析工具Mysqldumpslow
mysqldumpslow是mysql自带的用来分析慢查询的工具,当然不止这一种工具,还有percona-toolkit是percona公司出的一组命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql相关任务,包含以下内容:检查master和slave数据一致性/记录有效的归档/服务器信息汇总/分析和统计日志,为了省事这块使用mysqldumpslow命令做分析。需原创 2017-12-14 16:44:42 · 931 阅读 · 0 评论 -
slowlog慢日志切割
最近mySql数据库很慢,想了解下哪些sql语句的压力大,但mysql的slow_query.log太大,不好下载分析。可以通过mysqladmin flush-logs重新生成slow_query.log慢查询日志。实现:# mv slow_query.log slow_query.log.bak.20131106 //修改原来slow_query.log名字# mysql原创 2017-12-14 16:27:20 · 2731 阅读 · 0 评论 -
mysql 表空间大小及索引的查看
1.查看索引(1)单位是GBSELECT CONCAT(ROUND(SUM(index_length)/(1024*1024*1024), 2), ' GB') AS 'Total Index Size' FROM information_schema.TABLES WHERE table_schema LIKE 'zabbix3';+------------------+原创 2018-01-04 15:46:02 · 2775 阅读 · 0 评论 -
mysql INNODB 锁
为什么我们需要锁?先别急着回答、回想一下我们在逛淘宝下订单时的一个场景: InnoDB 是行锁、不存在锁升级问题、也就是、锁住 1 行和锁住 1 千万行的开销是一样 但是、InnoDB 行锁仍然存在一般的锁在高并发下所特有的"劣根性": ● 丢失更新:A的修改被B覆盖、谓之"前浪总被后浪盖" ● 脏读:原创 2018-02-02 16:18:34 · 198 阅读 · 0 评论 -
mysql 大表优化 持续更新
单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量:字段尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加原创 2018-02-03 10:05:17 · 244 阅读 · 0 评论 -
MySQL的innoDB锁机制以及死锁处理
MySQL的nnoDB锁机制InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,innodb正常的select ID from table where id=1;不会上任何锁,接下来详细讨论InnoDB的锁问题;一:InnoDB行锁的介绍。共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁...原创 2018-04-17 11:20:16 · 6847 阅读 · 1 评论 -
MYSQL 优化案列
场景我用的数据库是mysql5.6,下面简单的介绍下场景课程表create table Course(c_id int PRIMARY KEY,name varchar(10))数据100条学生表:create table Student(id int PRIMARY KEY,name varchar(10))数据70000条学生成绩表SCCREATE table SC...原创 2018-04-03 12:55:00 · 180 阅读 · 0 评论 -
mysql 子查询
一、子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中。 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。 子查询可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete、set或...原创 2018-04-02 16:40:42 · 191 阅读 · 0 评论 -
zabbix 脚本 研究
SELECT h. NAME AS '主机', t.description AS '监控项', t.priority AS '告警级别', count(DISTINCT e.eventid) AS '告警次数'FROM `triggers` t, `events` e, functions f, items i, `hosts` h, hosts_groups hgWHERE t.trigge...原创 2018-02-08 15:05:40 · 204 阅读 · 0 评论 -
zabbix 性能sql
SELECT h. NAME AS '主机', t.description AS '监控项', t.priority AS '告警级别', count(DISTINCT e.eventid) AS '告警次数'FROM `triggers` t, `events` e, functions f, items i, `hosts` h, hosts原创 2018-02-07 13:58:04 · 441 阅读 · 0 评论 -
MySQL高级 之 索引失效与优化详解
案例所用的表结构、索引、与数据如下:索引失效与优化1、全值匹配我最爱2、最佳左前缀法则(带头索引不能死,中间索引不能断)如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且 不跳过索引中的列。 正确的示例参考上图。错误的示例: 带头索引死: 中间索引断(带头索引生效,其他索引失效): 3、不要在索引转载 2018-02-05 17:04:05 · 217 阅读 · 0 评论 -
mysql 高效索引搭建 置顶
MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构。索引是在存储引擎中实现的,所以每种存储引擎中的索引都不一样。如MYISAM和InnoDB存储引擎只支持BTree索引;MEMORY和HEAP储存引擎可以支持HASH和BTREE索引。所以。。。。这里仅针对常用的InnoDB存储引擎所支持的BTree索引进行介绍:<img src="http原创 2018-02-05 15:03:34 · 286 阅读 · 0 评论