sql优化

MySQL(一)索引的创建和删除

佐手、 提交于 2020-03-18 19:36:14
索引是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。接下来将讲述如何创建、查看和删除索引。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。 目录 一、索引类别 二、创建索引 1.ALTER TABLE 2.CREATE INDEX 三、 删除索引 四、查看索引 五、建立索引的时机 六、索引的不足之处 七、使用索引的注意事项 执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。 一、索引类别 普通索引 这是最基本的索引,它没有任何限制 唯一索引(UNIQUE索引) 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一 主键索引(PRIMARY KEY) 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引 组合索引

mysql explain解析一 extra中的using index,using where,using index condition

不羁岁月 提交于 2020-03-18 18:52:19
1.简单介绍 using index 和using where只要使用了索引我们基本都能经常看到,而using index condition则是在mysql5.6后新加的新特性,我们先来看看mysql文档对using index condition的描述 附上mysql文档链接:https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html 简单来说,mysql开启了ICP的话,可以减少存储引擎访问基表的次数 下面来简单的介绍一下这三者的区别 using index :使用覆盖索引的时候就会出现 using where:在查找使用索引的情况下,需要回表去查询所需的数据 using index condition:查找使用了索引,但是需要回表查询数据 using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 以上四点就能看出它们之前的区别,或许有部分人都存在疑惑 using index & using where 和using index condition那个比较好,从上面的的解释中就能看出是前者比较好,毕竟不需要回表查询数据,效率上应该比较快的 下面是在stackoverflow中找到的答案:

MySQL优化-filesort-Using index condition

五迷三道 提交于 2020-03-18 18:45:32
首先要明白SQL的运行流程,方便理解。 http://blog.itpub.net/22664653/viewspace-1210844/ https://tech.meituan.com/mysql-index.html 阿里大神: https://yq.aliyun.com/topic/100?spm=5176.8217306.rtdmain.3.vmqTwp ICP 关闭时 ,仅仅使用索引作为访问数据的方式。 ICP 开启时 ,MySQL将在存储引擎层 利用索引过滤数据,减少不必要的回表,注意 虚线的using where 表示 如果where条件中含有没有被索引的字段,则还是要经过MySQL Server 层过滤。 ################# sending data 存储引擎搜集数据发送到客户端。 ################ filesort https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html ################# num1 是辅助索引 num2 是唯一索引 id是主键 desc select id,num1 from a where num1=2 order by id; ######考点是二级索引的叶子节点包含主键,不需要回表,(num1,id)是逻辑有序的

MySQL filesort优化案例一则

佐手、 提交于 2020-03-18 18:44:48
今天遇到一个filesort优化的案例,感觉不错,分享出来。 MySQL中filesort是什么意思?官方手册定义: MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause . The keys then are sorted and the rows are retrieved in sorted order。 一般来说如果有你的SQL查询语句中有order by且没有合适的索引时,通过EXPLAIN query可以在Extra列查看到Using filesort字样,当然一般来说此时也代表你需要去优化它了,无论是通过优化索引还是改变SQL查询实现方式。 先看表结构信息: CREATE TABLE `tbxxxx` ( `id` int(10) unsigned NOT NULL auto_increment COMMENT '??id', `a`

MySQL主从复制与读写分离

自作多情 提交于 2020-03-18 18:41:05
MySQL主从复制与读写分离的实现 转载 2013年01月17日 18:20:12 MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。 如下图所示: 下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考。 一、MySQL的安装与配置 具体的安装过程,建议参考我的这一篇文章: http://heylinux.com/archives/993.html 值得一提的是,我的安装过程都是源码包编译安装的,并且所有的配置与数据等都统一规划到了/opt/mysql目录中,因此在一台服务器上安装完成以后,可以将整个mysql目录打包,然后传到其它服务器上解包,便可立即使用。 二、MySQL主从复制 场景描述: 主数据库服务器:192.168.10.130,MySQL已经安装,并且无应用数据。 从数据库服务器:192.168.10

Mysql数据库写入数据速度优化

泄露秘密 提交于 2020-03-18 14:33:08
Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1;设置为0,可以提高写入速度。 值为0:提升写入速度,但是安全方面较差,mysql服务器宕机可能会造成数据丢失。 值为1:每一次事务提交或者事务外的指令都需要把日志写入硬盘,此过程消耗时间较长; 值为2:是每次操作不写入硬盘,而是写入系统缓存,日志仍然会每秒刷新硬盘; 2)innodb_autoextend_increment默认值为8M,调整为128M ; 此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。 3)innodb_log_buffer_size默认值为1M,调整为16M ; 此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。 4)innodb_log_file_size默认值为 8M,调整为128M ; 此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。 5)bulk_insert_buffer_size默认值为8M,调整为100M; 作用于使用 MyISAM存储引擎

<转>MySQL性能调优的10个方法

江枫思渺然 提交于 2020-03-18 14:30:50
文章原地址: http://mp.weixin.qq.com/s/oRXJRz_Y5drmIrcbxSKOcw 1. 选择合适的存储引擎: InnoDB 除非你的数据表使用来做只读或者全文检索 (相信现在提到全文检索,没人会用 MYSQL 了),你应该默认选择 InnoDB 。 你自己在测试的时候可能会发现 MyISAM 比 InnoDB 速度快,这是因为: MyISAM 只缓存索引,而 InnoDB 缓存数据和索引,MyISAM 不支持事务。 但是 如果你使用 innodb_flush_log_at_trx_commit = 2 可以获得接近的读取性能 (相差百倍) 。 1.1 如何将现有的 MyISAM 数据库转换为 InnoDB: mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=InnoDB;" > alter_table.sql perl -p -i -e 's/(search_[a-z_]+ ENGINE=)InnoDB//1MyISAM/g' alter_table.sql mysql -u [USER_NAME] -p [DATABASE_NAME] < alter_table

mysql-proxy实现读写分离

江枫思渺然 提交于 2020-03-18 14:23:40
其中Amoeba for MySQL也是实现读写分离 环境描述: 操作系统:CentOS6.5 32位 主服务器Master:192.168.179.146 从服务器Slave:192.168.179.147 调度服务器MySQL-Proxy:192.168.179.142 由于电脑配置不行,安装了三台虚拟机,就卡死了,只能将就一下,由于是一主 一从,所以,导致读写都在master上,有机会,再弄两台slave来测试 一.mysql主从复制,参考:http://www.cnblogs.com/lin3615/p/5679828.html 二、mysql-proxy实现读写分离 1、安装mysql-proxy 实现读写分离是有lua脚本实现的,现在mysql-proxy里面已经集成,无需再安装 下载:http://dev.mysql.com/downloads/mysql-proxy/ 一定要下载对应的版本 tar zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-32bit.tar.gz mv mysql-proxy-0.8.5-linux-glibc2.3-x86-32bit /usr/local/mysql-proxy 2、配置mysql-proxy,创建主配置文件 cd /usr/local/mysql-proxy mkdir lua

mysql proxy 读写分离

限于喜欢 提交于 2020-03-18 14:23:26
环境描述: 操作系统:CentOS6.5 32位 主服务器Master:192.168.179.146 从服务器Slave:192.168.179.147 调度服务器MySQL-Proxy:192.168.179.142 由于电脑配置不行,安装了三台虚拟机,就卡死了,只能将就一下,由于是一主 一从,所以,导致读写都在master上,有机会,再弄两台slave来测试 一.mysql主从复制,参考:http://www.cnblogs.com/lin3615/p/5679828.html 二、mysql-proxy实现读写分离 1、安装mysql-proxy 实现读写分离是有lua脚本实现的,现在mysql-proxy里面已经集成,无需再安装 下载:http://dev.mysql.com/downloads/mysql-proxy/ 一定要下载对应的版本 tar zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-32bit.tar.gz mv mysql-proxy-0.8.5-linux-glibc2.3-x86-32bit /usr/local/mysql-proxy 2、配置mysql-proxy,创建主配置文件 cd /usr/local/mysql-proxy mkdir lua #创建脚本存放目录 mkdir logs #创建日志目录

MySQL-事物、索引和视图

懵懂的女人 提交于 2020-03-18 13:56:23
1.视图 对于复杂的语句,多次使用时,要维护是一件很麻烦的事情。 解救的办法:就是定义一个视图,相当于编程语言中的封装。 定义视图 语法如下: create view v_student as select * from student where name = zhangsan; 调用: select * from v_student; 2.事物 当一件事情需要多个sql完成时,如果其中的某条语句出错,则希望整个操作都退回。 主要作用是保证命令的完整性。 2.1事物的四大特性 原子性:事物中的全部操作在数据库中是不可分割的,要么全部完成,要么都不完成。 一致性:几个并行执行的任务,其执行结果必须与按照某一顺序执行的结果一致。 隔离性:事物的执行不受其他事物的干扰,事物执行的结果对其他事物必须是透明的。 持久性:对于已经提交的事物,系统必须保证事物对该数据库的改变不曾丢失,即使数据库出现故障。 2.2 使用事物的情况 数据被更改时,包括insert、updata、del等操作进行时使用事物。 要求:表的类型必须是innodb或者bdb类型,才可以使用事物。 查看表的类型:show create table students; 修改表的类型:alter table 表名称 engine=innodb; 事物语句: 开启:begin; 提交:commit; 回滚:rollback; 2