• [技术干货] MySQL分区
     什么是表分区?表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。表分区与分表的区别分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。表分区有什么好处?分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2. 和单个磁盘或者文件系统相比,可以存储更多数据优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。 分区表的限制因素一个表最多只能有1024个分区MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。分区表中无法使用外键约束MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
  • [交流吐槽] 为什么用自增列作为主键
    如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
  • [技术干货] mysql join优化
    MySQL的join语句连接表使用的是nested-loop join算法,这个过程类似于嵌套循环,简单来说,就是遍历驱动表(外层表),每读出一行数据,取出连接字段到被驱动表(内层表)里查找满足条件的行,组成结果行要提升join语句的性能,就要尽可能减少嵌套循环的循环次数一个显著优化方式是对被驱动表的join字段建立索引,利用索引能快速匹配到对应的行,避免与内层表每一行记录做比较,极大地减少总循环次数。另一个优化点,就是连接时用小结果集驱动大结果集,在索引优化的基础上能进一步减少嵌套循环的次数如果难以判断哪个是大表,哪个是小表,可以用inner join连接,MySQL会自动选择小表去驱动大表避免使用JOIN关联太多的表对于 MySQL 来说,是存在关联缓存的,缓存的大小可以由join_buffer_size参数进行设置在 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存,如果在一个 SQL 中关联的表越多,所占用的内存也就越大如果程序中大量的使用了多表关联的操作,同时join_buffer_size设置的也不合理的情况下,就容易造成服务器内存溢出的情况,就会影响到服务器数据库性能的稳定性
  • [技术干货] MySQL REDO日志和UNDO日志
    Undo Log:Undo Log是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用了Undo Log来实现多版本并发控制(简称:MVCC)。事务的原子性(Atomicity)事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发生了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。原理Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为UndoLog)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。之所以能同时保证原子性和持久化,是因为以下特点:更新数据前记录Undo log。为了保证持久性,必须将数据在事务提交前写到磁盘。只要事务成功提交,数据必然已经持久化。Undo log必须先于数据持久化到磁盘。如果在G,H之间系统崩溃,undo log是完整的, 可以用来回滚事务。如果在A-F之间系统崩溃,因为数据没有持久化到磁盘。所以磁盘上的数据还是保持在事务开始前的状态。缺陷:每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一种机制来实现持久化,即Redo Log。Redo Log:原理和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。
  • [技术干货] mysql 高并发
    MySQL 高并发环境解决方案: 分库 分表 分布式 增加二级缓存。。。。。需求分析:互联网单位 每天大量数据读取,写入,并发性高。现有解决方式:水平分库分表,由单点分布到多点数据库中,从而降低单点数据库压力。集群方案:解决DB宕机带来的单点DB不能访问问题。读写分离策略:极大限度提高了应用中Read数据的速度和并发量。无法解决高写入压力。
  • [技术干货] 数据库的主从复制
    同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。 这样,显然不可取,也不是MySQL复制的默认设置。比如,在WEB前端页面上,用户增加了条记录,需要等待很长时间。异步复制:如同AJAX请求一样。master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心,MySQL的默认设置。半同步复制:master只保证slaves中的一个操作成功,就返回,其他slave不管。 这个功能,是由google为MySQL引入的。
  • [问题求助] 使用python脚本下载RDS MySQL备份文件的方法
    专家们好,能否提供下载RDS MySQL备份文件的Python模板,谢谢。
  • [技术干货] helm部署mysql
    helm添加源之后,查找mysql的chart[root@k8s-node2 ~]# helm show chart stable/mysqlapiVersion: v1appVersion: 5.7.30deprecated: truedescription: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relational  database system.home: https://www.mysql.com/icon: https://www.mysql.com/common/logos/logo-mysql-170x115.pngkeywords:- mysql- database- sqlname: mysqlsources:- https://github.com/kubernetes/charts- https://github.com/docker-library/mysqlversion: 1.6.9使用helm install [命名]  chart部署应用[root@k8s-node2 ~]#  helm install db stable/mysqlNAME: dbLAST DEPLOYED: Wed Sep  1 12:54:10 2021NAMESPACE: defaultSTATUS: deployedREVISION: 1NOTES:MySQL can be accessed via port 3306 on the following DNS name from within your cluster:db-mysql.default.svc.cluster.localTo get your root password run:    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)To connect to your database:1. Run an Ubuntu pod that you can use as a client:    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il2. Install the mysql client:    $ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, then provide your password:    $ mysql -h db-mysql -pTo connect to your database directly from outside the K8s cluster:    MYSQL_HOST=127.0.0.1    MYSQL_PORT=3306    # Execute the following command to route the connection:    kubectl port-forward svc/db-mysql 3306    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}直接启动pod会处于等待状态,需要拉起一个pv资源:[root@k8s-node2 ~]# cat pv.yamlapiVersion: v1kind: PersistentVolumemetadata:  name: pvo003spec:  capacity:    storage: 8Gi  accessModes:    - ReadWriteOnce  nfs:    server: 192.168.0.21    path: /ifs/kubernetes/dbkubectl apply -f pv.yaml用提示命令生成mysql的密码:[root@k8s-node2 ~]# kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echoez6WNDUHTG直接登录pod,测试MySQL:[root@k8s-node2 ~]# kubectl exec -it db-mysql-7f897f4d95-v7ggz bashkubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.root@db-mysql-7f897f4d95-v7ggz:/# mysql -uroot -pez6WNDUHTG          mysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 1808Server version: 5.7.30 MySQL Community Server (GPL)Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 
  • [技术干货] mysql死锁避免
    查出的线程杀死 killSELECT trx_MySQL_thread_id FROM information_schema.INNODB_TRX;设置锁的超时时间Innodb 行锁的等待时间,单位秒。可在会话级别设置,RDS 实例该参数的默认值为 50(秒)。生产环境不推荐使用过大的 innodb_lock_wait_timeout参数值该参数支持在会话级别修改,方便应用在会话级别单独设置某些特殊操作的行锁等待超时时间,如下:set innodb_lock_wait_timeout=1000; —设置当前会话 Innodb 行锁等待超时时间,单位秒。指定获取锁的顺序
  • [技术干货] mysql死锁
    死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程。表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB。死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。
  • [技术干货] mysql都有啥锁
    MySQL有三种锁的级别:页级、表级、行级。表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  • [openEuler] openEuler-20.03-LTS-SP1【aarch64】tomcat连接mysql
    架构信息和系统 ![cpu.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/163231syvxma6nuxcptnrm.png) 安装mysql及tomcat运行所需依赖 [root@a1 ~]# yum install -y java-1.8.0-openjdk mysql![1.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/163701imr64earmn1fhfw9.png) [root@a1 mysql]# mkdir -p /data/mysql/data/![2.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/163753ufj6honzsckpeglw.png) mysql初始化 [root@a1 mysql]# /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql![3.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/1638434rsbvyeffn3li0yg.png) 注意此时密码已经生成,用此密码登录 [root@a1 mysql]# systemctl start mysql ![4.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/1639246hw8ycu8irshdz8f.png) 安装tomcat [root@a1 local]# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.21/bin/apache-tomcat-8.0.21.tar.gz ![5.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/163956vsylfsjkuvvjeovo.png) [root@a1 local]# tar zxvf apache-tomcat-8.0.21.tar.gz [root@a1 local]# wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.21.tar.gz [root@a1 local]# tar zxvf mysql-connector-java-8.0.21.tar.gz 安装mysql-connect [root@a1 local]# cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar apache-tomcat-8.0.21/lib/ ![7.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/164802rofxtdbszzye3vpl.png) 编写连接mysql文件 [root@a1 local]# cd apache-tomcat-8.0.21/webapps/ [root@a1 webapps]# mkdir test [root@a1 webapps]# vim test/mysql.jsp ![701.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/164915uuvorrmpj7ft0hof.png) [root@a1 apache-tomcat-8.0.21]# cat webapps/test/mysql.jsp ![703.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/1706218v47vo3aa45efmye.png) 测试连接 ![702.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/165012plofqk5l9ftlahew.png) 自此tomcat连接mysql成功 ps 报错无关连接问题,更改mysql初始password后正常![777-1.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/181803hhqlz8ukoabpnipi.png) ![777.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202108/30/181815jilqt2hmmtkqkeda.png)
  • [技术干货] MySQL慢查询
    slow_query_log 慢查询开启状态。slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)。long_query_time 查询超过多少秒才记录
  • [技术干货] 使用explain优化sql和索引
    对于复杂、效率低的sql语句,我们通常是使用explain sql 来分析sql语句,这个语句可以打印出,语句的执行。这样方便我们分析,进行优化table:显示这一行的数据是关于哪张表的ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;const,system:当MySQL对某查询某部分进行优化,并转为一个常量时,使用这些访问类型。如果将主键置于where列表中,MySQL就能将该查询转化为一个常量。possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引
  • [技术干货] MySQL慢查询怎么解决
    slow_query_log 慢查询开启状态。slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)。long_query_time 查询超过多少秒才记录。
总条数:1406 到第 页
上滑加载中