InnoDB

【数据库相关】mysql-select count (*) 总结

喜你入骨 提交于 2021-02-07 18:36:02
今天看到个帖子,select count (*) from table 这个语句有很多的说道儿,想了一下就一条普普通通,简单的不能再简单的查询语句能有什么说道儿? 继续往下看了帖子,发现这玩意真的是有点东西。 1.验证: 首先这个语句是平时查询数量的时候常用的语句,当数据量足够大的时候,这个语句就显现出来问题了。 故上项目中的数据库中找一个最大的表来进行验证。发现这个表用正常的建表,建主键的时候。执行这条语句所需的时间很长,长到我已经没有耐心等到他查询出来结果了。 2.分析 这条语句为什么会执行这么长时间? 当然这条语句肯定不能在进行优化了(本人没有再进行优化的能力了),那为什么这个语句会执行这么长时间?看了帖子发现,是因为这个表的表结构中只有一条聚簇索引(本人理解:创建表的时候,主键自动生成的索引就叫聚簇索引),而执行这条语句的时候,在InnoDB存储引擎中,count(*)函数是先从磁盘中读取表中的数据到内存缓冲区,然后扫描全表获得行记录数的。因此查询的时间固然长。 3.优化 那么这种情况该如何优化呢? 就要用到一个二级索引的概念了,二级索引也叫辅助索引,也就是除了聚簇索引以外的索引都叫辅助索引。辅助索引的每一行记录都包含每一行的主键列,索引指向主键,InnoDB使用这个主键查找聚簇索引中的行。 那么在表中加上二级索引后执行的效率如何呢? 效率是瞎眼可见的提升。 4.结论

mysql5.7.20多实例编译安装

家住魔仙堡 提交于 2021-02-07 17:09:13
好记性不如烂笔头! MySQL多实例 实际上就是在同一台服务器上运行多个mysql服务进程。 相同点:公用同一套MySQL安装程序。 不同点:使用不同的配置文件(也可以相同)、启动程序(也可以相同)、数据库文件、端口号。 我理解的是类似同一套tomcat环境跑多个webapp项目,同一套python环境运行多个python程序。 环境准备 操作系统:CentOS release 6.5 (Final) MySQL版本:5.7.20 一部岛国大片(编译时用) MySQL5.7.20安装包下载 官网下载 MySQL Community Server 5.7.20 Operating System:Source Code OS Version:Generic Linux 一种带boost版,一种不带。新版的MySQL都需要安装boost库,如果使用不带boost版的安装包还要单独再下载boost包,网上找了好多,下载地址都是 wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz ,但是发现下载非常慢,后来直接下载带boost版的MySQL,将 里面的boost包拷贝出来,用来给不带boost版本的MySQL源码包编译用

mysql5.7配置文件

梦想的初衷 提交于 2021-02-07 04:20:24
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql #log-error = /var/log/mysql/error.log # By default we only accept connections from localhost #bind-address = 127.0.0.1 # Disabling symbolic-links is recommended to prevent assorted security risks #支持符号链接,就是可以通过软连接的方式,管理其他目录的数据库,最好不要开启,当一个磁盘或分区空间不够时,可以开启该参数将数据存储到其他的磁盘或分区。 #http://blog.csdn.net/moxiaomomo/article/details/17092871 symbolic-links=0 ########basic settings######## server-id = 11 port = 3306 user = mysql #设置autocommit=0,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务

MySql5.7配置文件my.cnf设置

夙愿已清 提交于 2021-02-07 02:46:42
# MySql5.7配置文件my.cnf设置 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] ###############################基础设置##################################### #Mysql服务的唯一编号 每个mysql服务Id需唯一 server-id = 1 #服务端口号 默认3306 port = 3306 #mysql安装根目录 basedir = /opt/mysql #mysql数据文件所在位置 datadir = /opt/mysql/data #临时目录 比如load data infile会用到 tmpdir = /tmp #设置socke文件所在目录 socket = /tmp/mysql.sock #主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容 skip-external-locking #只能用IP地址检查客户端的登录,不用主机名 skip_name_resolve = 1 #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节) character-set-server = utf8mb4 #数据库字符集对应一些排序等规则,注意要和character-set-server对应

mysql: keep auto-increment counter after server restart - inconsistent envers audit tables

拟墨画扇 提交于 2021-02-06 14:01:55
问题 I'm using InnoDb schema on mysql 5.5 . mysql 5.5 guide states: InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier. This is a big problem for me. I'm using envers to keep entities audits. I get as many errors as many "last rows" I delete. Suppose I'm starting insert data into an empty table. Suppose to insert 10 rows. Then

mysql: keep auto-increment counter after server restart - inconsistent envers audit tables

China☆狼群 提交于 2021-02-06 14:01:35
问题 I'm using InnoDb schema on mysql 5.5 . mysql 5.5 guide states: InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier. This is a big problem for me. I'm using envers to keep entities audits. I get as many errors as many "last rows" I delete. Suppose I'm starting insert data into an empty table. Suppose to insert 10 rows. Then

mysql: keep auto-increment counter after server restart - inconsistent envers audit tables

痞子三分冷 提交于 2021-02-06 14:00:39
问题 I'm using InnoDb schema on mysql 5.5 . mysql 5.5 guide states: InnoDB uses the in-memory auto-increment counter as long as the server runs. When the server is stopped and restarted, InnoDB reinitializes the counter for each table for the first INSERT to the table, as described earlier. This is a big problem for me. I'm using envers to keep entities audits. I get as many errors as many "last rows" I delete. Suppose I'm starting insert data into an empty table. Suppose to insert 10 rows. Then

MySQL 整体架构一览

本小妞迷上赌 提交于 2021-02-06 01:24:13
MySQL 在整体架构上分为 Server 层和存储引擎层。其中 Server 层,包括连接器、查询缓存、分析器、优化器、执行器等,存储过程、触发器、视图和内置函数都在这层实现。数据引擎层负责数据的存储和提取,如 InnoDB、MyISAM、Memory 等引擎。在客户端连接到 Server 层后,Server 会调用数据引擎提供的接口,进行数据的变更。 <img src="https://static001.geekbang.org/resource/image/0d/d9/0d2070e8f84c4801adbfa03bda1f98d9.png" alt="img" style="zoom:20%;" /> 连接器 负责和客户端建立连接,获取用户权限以及维持和管理连接。 通过 show processlist; 来查询连接的状态。在用户建立连接后,即使管理员改变连接用户的权限,也不会影响到已连接的用户。默认连接时长为 8 小时,超过时间后将会被断开。 简单说下长连接: 优势:在连接时间内,客户端一直使用同一连接,避免多次连接的资源消耗。 劣势:在 MySQL 执行时,使用的内存被连接对象管理,由于长时间没有被释放,会导致系统内存溢出,被系统kill. 所以需要定期断开长连接,或执行大查询后,断开连接。MySQL 5.7 后,可以通过 mysql_rest_connection

管理博文 亿级QPS技术架构如何搭建?阿里全新开源2021高并发技术小册,简直不要太香!

依然范特西╮ 提交于 2021-02-06 00:01:22
基础 我之前也踩过一些坑, 参与的一个创业项目在初始阶段就采用了服务化的架构,但由于当时人力有限,团队技术积累不足,因此在实际项目开发过程中,发现无法驾驭如此复杂的架构,也出现了问题难以定位、系统整体性能下降等多方面的问题,甚至连系统宕机了都很难追查到根本原因,最后不得不把服务做整合,回归到简单的单体架构中。 所以我建议一般系统的演进过程应该遵循下面的思路: 最简单的系统设计满足业务需求和流量现状,选择最熟悉的技术体系。随着流量的增加和业务的变化,修正架构中存在问题的点,如单点问题,横向扩展问题,性能无法满足需求的组件。在这个过程中,选择社区成熟的、团队熟悉的组件帮助我们解决问题,在社区没有合适解决方案的前提下才会自己造轮子。当对架构的小修小补无法满足需求时,考虑重构、重写等大的调整方式以解决现有的问题。 以淘宝为例, 当时该业务从 0 到 1 的阶段是通过购买的方式快速搭建了系统。而后,随着流量的增长,淘宝做了一系列的技术改造来提升高并发处理能力,比如数据库存储引擎从MyISAM 迁移到 InnoDB,数据库做分库分表,增加缓存,启动中间件研发等。当这些都无法满足时就考虑对整体架构做大规模重构,比如说著名的“五彩石”项目让淘宝的架构从单体演进为服务化架构。正是通过逐步的技术演进,淘宝才进化出如今承担过亿QPS 的技术架构。 下面就为大家展示一份技术小册,需要的朋友点赞收藏

Why does TRANSACTION / COMMIT improve performance so much with PHP/MySQL (InnoDB)?

别来无恙 提交于 2021-02-05 17:59:03
问题 I've been working with importing large CSV files of data; usually less than 100,000 records. I'm working with PHP and MySQL (InnoDB tables). I needed to use PHP to transform some fields and do some text processing prior to the MySQL INSERT s (part of process_note_data() in code below). MySQL's LOAD DATA was not feasible, so please do not suggest it. I recently tried to improve the speed of this process by using MySQL transactions using START TRANSACTION and COMMIT . The performance increase