数据库同步工具
sqlserver,Mysql数据同步软件

mysql优化总结)

购买事宜请联系QQ:1793040

course_name

course_class

工作日

course_teacher

MySQL

1525教育大楼

星期一

张三

Java

1521年教育大楼

星期三

李思

MySQL

1521年教育大楼

星期五

张三

相关性:一个字段可以确定B字段,然后B字段取决于A字段。例如,如果您知道下一堂课是数学课,则可以确定老师是谁。因此,星期几下一堂课的组合可以形成一个复合主键,它可以确定要去哪个教室以及谁是老师。但是我们经常添加一个id作为主键,并消除对主键的某些依赖。

部分依赖于主键:字段取决于组合主键的一部分。

解决方案:添加一个独立字段作为主键。

运输相关性:B字段取决于A,C字段取决于B。例如,在上面的示例中,谁是老师取决于哪个班级,哪个班级取决于主键ID。因此,您需要将此表分为时间表和课程表两个表(独立的数据来独立地建立表):

id 工作日 course_class course_id
1001 星期一 1521年教育大楼 3546

course_id course_name course_teacher
3546 Java 张三

这样可以减少数据的冗余(即使从星期一到星期日每天都有Java类,也只有course_id:3546出现7次)

早期的问题:如何选择MyISAM和Innodb?

此问题不再存在。 Innodb在各个方面都在不断改进和赶上MyISAM,默认情况下MySQL也使用MyISAM。

存储引擎:MySQL中的数据,索引和其他对象的存储方式是文件系统的一种实现。

显示引擎

Engine 支持 评论
InnoDB 默认 支持事务,行级锁定和外键
MyISAM MyISAM存储引擎

MyISAM Innodb
文件格式 数据和索引分别存储,data.MYD,index.MYI 数据和索引集中存储在.ibd
文件可以移动 是的,一个表对应于.frm,MYD和MYI文件 否,因为与它关联的数据下还有其他文件
记录存储顺序 按记录插入顺序保存 为了根据主键的大小插入
空间碎片(删除记录并刷新表名后,表文件大小保持不变) 已生成。调度完成:使用命令优化表来实现表名 未生成
交易 不支持 支持
外键 不支持 支持
锁支持(锁是一种避免资源争用的机制,MySQL锁对用户几乎是透明的) 表级锁定 行级锁定,表级锁定,低锁定强度和高并发能力

锁定扩展名

表级锁定:锁定表 table_name1 \ lt; table_name2 \ gt;…读/写,解锁表lt; table_name1 \ lt; table_name2 \ gt;…其中,read是一个共享锁。一旦锁定,没有客户端可以读取它;写是互斥/写锁。只有锁定的客户端可以读取和写入,而其他客户端既不可读也不可写。锁定的是一个表或几个表。

行级锁(行级锁):锁定记录的一行或多行。共享锁:选择* from \ lt; table_name \ gt;其中条件 LOCK IN SHARE MODE ;,向查询记录添加共享锁;选择*从\ lt; table_name \ gt;其中条件 FOR UPDATE ;,查询记录添加排他锁。 值得注意的如下:InnoDB的行锁实际上是一个子范围锁,它根据条件锁定部分范围,而不是映射到特定的行,因此还有另一个科学名称:例如,从stu中选择*,其中id \ lt; 20 LOCK IN SHARE MODE将ID范围锁定为20以下,您可能无法插入ID为18或22的新记录。

如果没有特殊要求,请使用默认的Innodb。

MyISAM:专注于读写的应用程序,例如博客系统和新闻门户。

Innodb:更新(删除)操作的频率也很高,或确保数据的完整性;高并发性,支持事务处理和外键以确保数据完整性。如OA自动化办公系统。

关键字和数据之间的映射关系称为索引(==包含关键字和磁盘中记录的对应地址==)关键字是从数据中提取的特定内容,用于标识和检索数据。

  • 相对于数据本身的关键字,==少量数据==
  • 关键字是==有序==,二进制搜索可以快速确定位置

该库为每本书添加一个索引号(category-floor-bookshelf),并且字典使用字母顺序来编译目录等,所有内容均使用索引。

常规索引(键),唯一索引(唯一键),主键索引(主键),全文索引(全文本键)

三个索引的索引编制方法相同,但是对索引关键字的限制不同:

  • 常规索引:关键字无限制
  • 唯一索引:记录中提供的关键字不能重复
  • 主键索引:要求关键字必须唯一且不能为空

显示创建表的表名称:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

显示创建表user_index:

1

2

3

4

5

6

7

8

9

10

根据索引名称删除公用索引,唯一索引,全文索引:alter table表名drop KEY索引名

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

删除主键索引:alter table表名删除主键(因为只有一个主键)。在此值得注意的是,如果主键自增长,则无法直接执行此操作(自增长取决于主键索引):

1

2

3

4

但是通常不会删除主键,因为主键的设计必须与业务逻辑无关。

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

我们可以通过以下解释selelct来分析执行SQL语句之前的执行计划:

1

2

3

4

1

2

例如,搜索标题中包含mysql的文章:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

此SQL执行计划不使用索引(例如,表达式匹配以通配符开头的表达式),因此只能执行全表扫描,这效率极低。在实际工程中几乎不采用。通常,将使用支持中文的第三方提供的全文索引来完成此操作。

但是关键字查询仍然可以执行热搜索提醒功能,例如重新键入mysql后,注意mysql教程,mysql下载,mysql安装步骤等。使用的语句是:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

这种类似可以使用索引(当然,前提是标题字段已被索引)。

创建复合索引:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

原理是根据从first_name提取的关键字对索引进行排序,如果无法确定顺序,则按从last_name提取的关键字进行排序,即索引仅根据记录的first_name字段的值对表进行排序。

因此,从first_name =?的人中选择*。可以使用索引,并从* last_name =?的人中选择*。无法使用索引。

那么综合索引的应用场景是什么? ==组合查询==

例如,对于select * person from first_name =?和last_name =?,复合索引比分别索引first_name和last_name更有效。容易理解,复合索引首先对与first_name =?匹配的记录进行二进制搜索,然后对这些记录中与last_name匹配的记录进行二进制搜索,仅涉及索引表。要单独创建索引,请查找与first_name =?匹配的记录。在first_name索引表中,找到与last_name =?相匹配的记录。在last_name索引表中。

如果一侧没有可用的索引,则将导致对整个SQL语句进行全表扫描

状态值字段(例如性别和付款状态)通常只有几个可能的值。即使已为此类字段建立索引,它们也通常不可用。这是因为状态值可能与大量记录匹配。在这种情况下,MySQL会认为使用索引比全表扫描效率低,因此放弃了索引。索引是对磁盘的随机访问,而全表扫描是对磁盘的顺序访问。这就像拥有一幢20层的办公楼。建筑物下的索引板显示,一家公司对应于几个不相邻的楼层。您去公司找人,而不是按照索引板的提示去一层,然后向下看索引板然后上楼,最好是一层一层地找到顶层从一楼开始。

  • 建立基本索引:在where,order by和join字段上创建索引。
  • 优化,组合索引:基于业务逻辑

    • 如果情况频繁发生,则可以考虑将多字段索引升级为==复合索引==
    • 如果您可以增加单个字段的索引,则可以看到==索引覆盖率==,那么您可以考虑为该字段建立索引
    • 在查询过程中不常用的索引应删除

语法:索引(字段(10)),使用字段值的前10个字符来构建索引,默认值是使用字段的全部内容来构建索引。

前提条件:前缀具有高度的识别性。例如,密码非常适合用于建立前缀索引,因为密码几乎不同。

==实际操作的难度==:这是前缀截取的长度。

我们可以使用选择计数(*)/计数(与众不同(密码,prefixLen));通过调整prefixLen的值(从1增加)来检查不同前缀长度的平均匹配度。好的(密码的第一个prefixLen字符几乎可以确定唯一记录)

Btree(多路平衡搜索树)是一种数据结构,被广泛用于实现磁盘==上的索引功能,并且也是大多数数据库索引表的实现。

以添加索引(名字,姓氏)为例:

BTree的一个节点可以存储多个关键字,该节点的大小取决于计算机的文件系统,因此我们可以通过减少索引字段的长度来使该节点存储更多的关键字。如果节点中的关键字已满,则可以通过每个关键字之间的子节点指针来扩展索引表,但不能破坏结构的顺序,例如first_name第一顺序,last_name第二顺序规则,新添加的韩向可以插入韩康之后。白棋lt;韩非韩康lt;李世民赵社李勋焕王玉燕杨不后悔。这与二叉搜索树的思想相同,除了二叉搜索树的搜索效率是log(2,N)(N的对数基于2),BTree的搜索效率是log( x,N)(其中x是节点关键字的数量,可以达到1000以上)。

从日志(1000 +,N)可以看出,少量磁盘读取可以遍历大量数据,这也是btree的设计目的。

在集群结构(也在BTree上升级)中,关键字和记录存储在一起。

在MySQL中,只有Innodb的==主键索引是群集结构==,其他索引(包括Innodb的非主键索引)是典型的BTree结构。

将索引加载到内存中时,将使用哈希结构进行存储。

缓存select语句的查询结果

在Windows上为my.ini,在Linux上为my.cnf

在[mysqld]部分中配置查询_ *** _类型:

  • 0:未打开
  • 1:打开,默认情况下启用所有缓存。您需要在SQL语句中添加select sql-no-***提示符以放弃缓存
  • 2:启用,默认情况下不进行缓存,您需要在SQL语句中添加select sql-***以主动缓存(== common ==)

更改配置后,需要重新启动以使配置生效。重新启动后,您可以使用show变量,例如” query _ *** _ type”;查看:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

通过配置项目查询_ *** _大小设置:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

从用户选择sql _ *** *;

重置查询***;

更改数据表时,将删除基于该数据表的所有缓存。 (表面级别的管理不是记录级别的管理,因此失败率更高)

  1. 应用程序不应该在意查询***的使用。您可以尝试使用它,但是业务逻辑不能由查询***确定,因为查询***由DBA管理。
  2. 高速缓存存储为SQL语句的键,因此,即使SQL语句具有相同的功能,如果有多余的空间或大小写不同,高速缓存也将不匹配。

通常,我们创建的表对应于一组存储文件。使用MyISAM存储引擎时,它是.MYI和.MYD文件,而使用Innodb存储引擎时,则是.ibd和.frm(表结构)文件。

当数据量很大(通常超过1000万个记录级别)时,MySQL的性能将开始下降,这时我们需要将数据分散到多组存储文件中,以确保效率单个文件==。

最常见的分区方案是按id进行分区,如下所示:id的哈希值取10为模,以将数据均匀地分布到10个.ibd存储文件中:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

查看数据目录:

1

2

3

4

5

6

是==条件分区==算法,根据数据大小范围进行分区(使用某些条件将数据扩展到不同的分区中)。

如下所示,根据文章的发布时间,将按照2018年8月,9月和10月的分区存储数据:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

1

2

1

2

3

4

5

6

7

8

9

10

11

1

2

1

2

3

4

1

注意:==删除分区后,分区中的原始数据也将被删除! ==

添加分区

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

1

密钥/哈希分区管理不会删除数据,但是每次调整(添加或销毁分区)都会重写所有数据并将其分配给新分区。 ==效率极低==,最好在设计阶段考虑分区策略。

当数据表中的数据量很大时,只会出现分区带来的效率提高。

仅当搜索字段是分区字段时,分区带来的效率提升才会更加明显。因此,==分区字段的选择非常重要==,并且应该根据分区字段==尽可能地调整==业务逻辑(尝试将分区字段用作查询条件)。

水平拆分:通过建立具有相同结构的多个表来存储数据

垂直拆分:将经常一起使用的字段放在单独的表中,拆分表记录具有一对一的对应关系。

  • 解压缩数据库
  • 分区算法的局限性
  • 数据库支持不是完美的(mysql仅在5.1之后支持分区操作)
  • 借用诸如mem ***和redis id booster之类的第三方应用程序
  • 构建一个单独的表,该表仅包含一个具有id的字段,并每次将该字段作为数据记录的id递增

横向扩展:从根本上(单机硬件处理能力受到限制)以提高数据库性能。由此产生的相关技术:==读写分离,负载平衡==

  • 红帽企业Linux服务器7.0版(Maipo)(虚拟机)
  • mysql5.7(下载地址)

解压缩到外部提供的目录(我创建了一个/export/服务器来存储它)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

添加mysql目录的组和组所有者:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

创建一个mysql数据存储目录(其中/export/data是我专门创建的用于存储各种服务数据的目录)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

初始化mysql服务

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

如果成功,将显示mysql的root帐户的初始密码,并写下以进行后续登录。如果错误丢失,则可以依次使用yum instally

进行安装。

配置my.cnf

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

添加服务以在启动时自动启动

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

启动服务

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

配置环境变量,在/etc/profile中添加以下内容

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

使配置生效

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

使用root登录

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

登录后,更改root帐户密码(为方便起见,我将密码更改为root),否则操作数据库将报告错误

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

所有远程客户端都可以访问设置服务

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

这样,您可以使用Navicat远程连接到主机上虚拟机Linux上的MySQL

配置主服务器

使用linux(192.168.10.10)上的mysql作为主服务器,并使用主机(192.168.10.1)上的mysql作为从服务器来配置主从复制。

如下修改master的my.cnf

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

重新启动主控

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

登录到主服务器以检查配置是否生效(ON表示打开,默认为OFF):

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

在master数据库中创建一个备份帐户:backup是用户名,%表示任何远程地址,用户可以使用密码1234通过任意一个连接到master远程客户端

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

检查用户表以查看我们刚刚创建的用户:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

创建一个新的测试数据库并创建用于后续测试的商品表

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

重新启动服务并将数据库状态刷新到存储文件(具有读取锁定意味着在此过程中,客户端只能读取数据以便获得一致的快照)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

检查当前二进制日志和主文件上的偏移量(注意文件和位置)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

1

再次在从属服务器上执行test.sql的内容。

配置从属

修改从站的my.ini文件中的[mysqld]部分

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

保存更改后还原从站,WIN + R-\\ u> services.msc-\> MySQL5.7->重新启动

登录到从服务器以检查log_bin是否已启用:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

配置与主服务器的同步复制:

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

启用从节点并检查状态

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

注意检查4、14、15这三行,如果与我一致,则表示从属配置成功

关闭主机的读取锁

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

将数据插入主数据库

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

检查从站是否已自动同步数据

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

至此,主从复制配置成功! 🙂

使用mysqlreplicate命令快速设置MySQL主从复制

读写分离取决于主从复制,而主从复制用于读写分离。因为主从复制要求从属不能写而只能读(如果您对从属执行写操作,那么show slave status将显示Slave_SQL_Running = NO,此时您需要如上所述手动同步从属) 。

就像学习JDBC时定义的数据库一样,我们可以提取ReadDataBase,WriteDataBase实现数据库,但是这种方法不能使用出色的线程池技术(例如DruidDataSource)来帮助我们管理连接,也不能使用Spring AOP来实现。连接权。 DAO层是透明的。

如果可以使用Spring AOP解决数据源切换问题,则可以将其与Mybatis和Druid集成。

当我们集成Spring1和Mybatis时,我们只需要编写DAO接口和相应的SQL语句,那么谁创建了DAO实例?实际上,它是由Spring为我们创建的。它使用我们注入的数据源来帮助我们完成从数据库中获取数据库连接,使用该连接执行SQL语句以及最终将连接返回到数据源的过程。

如果可以在调用DAO接口时根据接口方法的命名约定(添加addXXX/createXXX,deleteXX/removeXXX,updateXXXXXX,检查selectXX/findXXX/getXX/queryXXX)动态选择数据源,则主写入数据源对应连接从属),则可以实现读写分离。

项目结构

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

数据类

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

spring配置文件

RoutingDataSourceImpl是实现动态交换功能的核心类,稍后将对其进行介绍。

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

dp.properties

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

mybatis-config.xml

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

映射器界面和配置文件

ArticleMapper.java

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

ArticleMapper.xml

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

核心类

RoutingDataSourceImpl

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

它的主要功能是我们最初仅配置了一个数据源,因此当Spring动态使用时直接使用此数据源。DAO接口,现在我们已经读取了,要写入两个数据源,我们需要添加一些自己的逻辑来告诉哪个接口使用哪个数据源(用于读取数据的从属接口使用从属,用于写入数据的接口使用master。此类告诉Spring使用哪个数据源是AbstractRoutingDataSource必须将methodCurrent方法重写为返回数据源的ID,并结合spring配置文件(下一部分代码的第5行,第6行)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

如果确定currentLookupKey返回读取,则使用slaveDataSource,如果返回写入,则使用masterDataSource。

DataSourceHandler

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

DataSourceAspect

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

测试读写分离

如何测试从站的读数?您可以在写入后更改复制到从属设备的数据,然后读取数据以知道已从从属设备读取了数据。 ==注意==,一旦写入从站,则必须再次手动将从站与主站同步,否则主从复制将无效。

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

  • 轮询
  • 加权轮询:根据处理能力进行加权
  • 负载分配:根据当前的空闲状态(但测试每个节点的内存使用率和CPU利用率,然后比较并选择最空闲的一个,效率太低)

在服务器体系结构中,为了确保7×24服务器不宕机和联机,有必要为每个单点服务器(由一台服务器提供服务的服务器,例如写入服务器)提供一台冗余计算机。服务器和数据库中间件)。

对于写入服务器,必须提供相同的写入冗余服务器。如果写入服务器运行状况良好(通过心跳检测到写入冗余),则写入冗余将充当从服务器复制复制写入服务器的内容。当写服务器发生故障时,写冗余服务器将排在最前面,作为写服务器继续提供服务。该过程对外界是透明的,也就是说,外界仅通过一个IP访问服务。

DDL(数据库定义语言)是指数据库表结构的定义(创建表)和维护(更改表)的语言。当版本低于MySQL 5.6时,在线执行DDL将导致整个表被独占锁定。此时,表处于维护和不可操作状态,这将导致在此期间对表的所有访问均无响应。但是在MySQL5.6之后,支持在线DDL,这大大缩短了锁定时间。

优化技术是维护表结构的DDL(例如添加列或添加索引),这是==复制==策略。想法:创建一个满足新结构的新表,并将旧表数据==逐项==导入(复制)到新表中,以确保==一次性锁定的内容==(锁定的是正在处理的数据),而其他任务可以在旧表上执行。在导入过程中,对旧表的所有操作均以日志形式记录。导入完成后,将在新表上再次执行更新日志(以确保一致性)。最后,新表替换旧表(在应用程序中完成,或对数据库进行重命名,视图已完成)。

但是随着MySQL的升级,这个问题几乎消失了。

恢复数据时,可能会导入大量数据。这时,为了快速导入,您需要掌握一些技能:

  1. 导入时==首先禁用索引和约束==:

<表边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

数据导入完成后,打开索引和约束并一次创建索引

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

  1. 如果数据库使用的引擎是Innodb,则它==默认将为每个写指令添加一个事务==(这也会消耗一定的因此,建议先手动打开交易,然后执行一定数量的批量导入,最后手动提交交易。
  2. 如果批量导入的SQL指令格式相同,但数据不同,则应首先准备==预编译==一点,这样也可以节省大量时间进行重复编译。

尝试确保没有大的偏移量。例如,限制10000,10等效于丢弃前10000行,然后占用10行。您可以添加一些条件来过滤(完成过滤),而不是添加条件来限制已跳过的数据。这是==抵消做无用功==的问题。与实际项目相对应,为避免出现大页码,请尝试引导用户进行条件过滤。

也就是说,尝试选择所需的字段选择,但是这种效果不是很大,因为在网络上传输几十个或几百个字节没有延迟,并且流行的ORM框架现在使用select * ,仅在设计表时,我们注意将包含大量数据的字段分开。例如,可以从产品详细信息表中单独提取产品详细信息,这样在查看产品摘要页面时的加载速度将不会受到影响。

它的逻辑是随机排序(为每个数据生成一个随机数,然后根据随机数的大小排序)。例如,通过rand()限制5从学生订单中选择*的执行效率非常低,因为它会为表中的每条数据生成随机数并对它们进行排序,而我们只需要前5个。

解决方案思想:在应用程序中,生成一个随机主键,然后使用该主键在数据库中进行搜索。

多表查询:联接和子查询是涉及多个表的查询。如果使用explain来分析执行计划,您会发现多表查询也是通过表处理的一个表,最后合并结果。因此,可以说单表查询给应用程序带来了计算压力,而多表查询给数据库带来了压力。

现在有一个ORM框架可以帮助我们解决由单表查询引起的对象映射问题(查询单个表时,如果找到外键,则会自动查询相关表,一个表一个地查询)表)。

在MyISAM存储引擎中,表中的行数是自动记录的,因此使用计数(*)可以快速返回。 Innodb中没有这样的计数器,这要求我们手动计算记录数。解决方案是使用单独的表:

id 计数
1 学生 100

如果可以确定只检索一项,则建议添加限制1。实际上,ORM框架可以帮助我们做到这一点(查询单个项将自动添加限制1)。

用于记录执行时间超过某个临界值的SQL日志,用于快速定位慢速查询,并为我们的优化提供参考。

配置项:slow_query_log

您可以使用诸如” slov_query_log”之类的显示变量来检查是否已启用它。如果状态值为OFF,则可以使用set GLOBAL slow_query_log = on启用它。它将在datadir下生成一个xxx-slow.log文件。

配置项:long_query_time

视图:在几秒钟内显示诸如” long_query_time”之类的变量

设置:设置long_query_time = 0.5

实际操作应设置为较长时间到较短时间,最慢的SQL将被优化掉

一旦SQL超过了我们设置的临界时间,它将记录在xxx-slow.log

配置项:分析

设置分析=上

打开后,将自动记录所有SQL执行细节

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

显示个人资料

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

显示查询Query_ID的配置文件

在上述显示配置文件的结果中,每个SQL都有一个Query_ID,可用于查看已执行了哪些步骤来执行该SQL,并且每个SQL都占用了多个时间字段

以下配置均取决于实际操作环境

  • max_connections,最大客户端连接数

    <表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

    1

    2

    3

    4

    5

    6

  • table_open _ ***,表文件句柄缓存(表数据存储在磁盘上,缓存磁盘文件句柄以打开文件以读取数据)

    <表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

    1

    2

    3

    4

    5

    6

  • key_buffer_size,索引高速缓存的大小(从磁盘读取的索引被高速缓存到内存中,可以将其设置为更大的大小以便于快速检索)

    <表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

    1

    2

    3

    4

    5

    6

  • innodb_buffer_pool_size,Innodb存储引擎缓冲池大小(对于Innodb最重要的配置,如果所有表都使用Innodb,那么甚至建议将该值设置为物理内存的80%,Innodb的许多性能提升例如索引依赖这个)

    <表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

    1

    2

    3

    4

    5

    6

  • innodb_file_per_table(在innodb中,表数据存储在.ibd文件中,如果此配置项设置为ON,则表对应于ibd文件,否则所有innodb共享表空间)

安装MySQL附带了压力测试工具mysqlslap(位于bin目录中)

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

<表格边框=" 0" cellpadding =" 0" cellspacing =" 0">

1

2

3

4

5

6

7

8

9

1

2

3

4

5

6

7

8

9

文章转载于:https://www.nowcoder.com/discuss/150059type=0\\u0026order=0\\u0026pos=8\\u0026page=0

未经允许不得转载:数据库同步软件|Mysql数据同步软件|sqlserver数据库同步工具|异构同步 » mysql优化总结)

分享到:更多 ()

syncnavigator 8.6.2 企业版

联系我们联系我们