1.选择最合适的字段属性
MySQL是一个关系数据库,可以很好地支持大型数据存储,但是通常,数据库中的表越小,其上的查询越快。因此,当创建表格时,为了获得更好的性能,我们可以尽可能地给予田地的宽度。
例如:定义邮政编码字段时,如果将其设置为char(255),显然会在数据库中添加不必要的空间,甚至VARCHAR的类型也是冗余的,因为Char(6)可以很好。完成任务。如果可以的话,我们应该使用Mediunint而不是BigInt来定义整形手术领域。
2.尝试将字段设置为不为空
在可能的情况下,尝试将字段设置为不为null,以便在将来执行查询时,数据库不需要比较null值。
对于某些文本字段,例如“省”或“性别”,我们可以将其定义为枚举类型。因为在MySQL中,枚举类型被视为数值数据,而数值数据的值比文本要快得多键入。这样,我们可以提高数据库的性能。
3.使用连接(JOIN)替换查查询(子查询)
MySQL从4.1中支持SQL子 - 问题。这项技术可以使用Select语句创建单个案例查询结果,然后将此结果用作另一个查询中的滤波器条件。
例如:我们需要在客户的基本信息表中删除客户,而没有任何订单,我们可以使用子女查询从销售信息表中获取所有订单的客户ID,然后将结果传递给主要查询。如下图所示:
如果您使用连接完成这项工作,速度将更快,尤其是当Salesinfo表具有customerID索引时,性能会更好。查询如下:
连接更有效的原因是因为MySQL不需要在内存中创建临时表即可完成此逻辑查询工作。
此外,如果您的应用程序中有很多加入查询,则应确认已建立了两个表中的加入字段。这样,MySQL将启动为您优化Join的SQL语句的机制。用于连接的字段应为相同的类型。
例如:如果要将小数字段放在int字段中,MySQL无法使用其索引。对于这些字符串类型,需要相同的字符集。(这两个表的字符集可能不同)。
内部联接连接也称为等效连接,左/右连接是外部链接。
在确认内连接的许多方面之后,性能相对较快,因为内部联接是等效的连接,并且行的数量可能相对较小,但是我们需要记住,有些句子使用等效连接的不可见,例如::
SQL中的连接查询包括内连接,左联接(左连接),右连接(右连接)和完整的加入。实际上它们之间没有太大的区别。这只是查询的询问结果是不同的。
例如,我们有两个表:
订单表与外部密钥ID_P和人员表关联。
内部连接,当两个表连接到查询时,仅在两个表中完全匹配的结果集。
我们使用内部连接连接到两个表,SQL如下:
查询结果集:
此连接方法中订单表中的ID_P字段在人表中找不到匹配,也不会列出。
注意:这只是笛卡尔产品。例如,表A有5个数据,表B具有3个数据,因此最终结果具有数据。
但是,如果这两个表是关联的:含义更改,目前价格等同于:
但是,本文不符合规范,并且只能用于某些数据库,例如sqlserver.com.最好不要像这样写。
内部连接query()和相关Query()差异
左JOIN,当两个表连接到查询时,即使右表中没有匹配记录,它们也会返回左表的所有行。
我们使用左联接连接到两个表。SQL如下:
查询结果如下:
可以看出,右表(订单表)在人表中的LastName线的ID_P字段不匹配,但是查询结果仍然保留了行。
连接到两个表时,即使在左表中没有匹配记录,右JOIN也会返回右表上的所有行。
我们使用正确的加入将两个表连接到两个表,如下所示:
查询结果如下:
订单表中的最后一个记录ID_P字段值为65,该值未记录在左表中,但仍保留。
完整的加入,当两个表连接到查询时,返回到左表和所有与右表中不匹配的行。
我们使用Full Join连接到两个表,SQL如下:
查询结果如下:
查询结果是左JOIN和右JOIN的集合。
4.使用联盟替换手动创建的临时表
MySQL支持4.0版的Union查询。他可以关闭需要在一个查询中使用临时表的两个或多个选择。当客户端查询结束后,将自动删除临时表,以确保数据库既整洁又高效率。查询,我们只需要使用联合作为关键字来连接多个选择语句。应该注意的是,所有选定语句中的字段数应相同。以下示例演示了联合查询。
当我们可以确认重复结果设置或不关心重复结果设置时,请尝试使用联盟全部而不是工会,因为联盟和工会之间的差异是前者需要设置两个或更多结果,并且然后在唯一性之前执行独特性。过滤器操作将涉及排序,增加大量CPU操作,增加资源消耗和延迟。
5.事务
尽管我们可以使用子查询,加入和联合来创建各种查询,但并非所有数据库操作都只能使用其中一个或几个来完成。经常需要使用一系列陈述来完成某个某个陈述job.ut在这种情况下,当此语句中的语句正在运行错误时,整个语句块的操作变得不确定。
想象一下,如果将某些数据同时插入两个关联表,则可能发生:成功更新第一表后,数据库突然出乎意料地发生,导致第二个表的操作未完成,这将导致数据不完整的数据甚至破坏数据库中的数据。为了避免这种情况,交易应使用。它的角色要么成功地操作句子中的每个句子,要么是失败。
换句话说,可以维护数据库中数据的一致性和完整性。事务始于开始关键字和提交关键字结束。ASQL语句操作失败,然后回滚命令可以将数据库恢复到状态,然后才能将其恢复到状态。开始。
交易的另一个角色是,当多个用户同时使用相同的数据源时,他可以使用锁定数据库的方法为用户提供安全的访问机制,这可以确保用户的操作不会受到其他用户的干扰。
一般而言,交易必须满足四个条件(酸):原子能或无能),一致性,隔离(也称为独立性),耐用性。
交易的水分:
1。:事务a读取交易B更新的数据,然后b回头进行操作,然后读取数据读取为脏数据
2。:事务A多次读取同一件事。在交易的过程中,已多次更新交易B并提交到数据,从而导致不一致的结果多次读取相同的数据。
3。:系统管理员A A将数据库中的所有学生从特定分数更改为ABCDE级别,但是此时系统管理员b插入了特定的分数记录。有一个尚未更改的记录,好像一样发生幻想,这就是幻觉。
摘要:很容易反复混淆和幻想阅读。重复阅读重点是修改。Phantom阅读重点是新的或已删除的。要解决无法反复阅读的问题,您只需要锁定符合条件的行,解决幻想阅读的锁定
MySQL交易隔离级别:
不重复读取的启动吗?是否反复读取读取方式,还是不序列化,无论交易控制声明是否为:
6.使用外部钥匙
锁定表的方法可以维持数据的完整性,但他不能保证数据的相关性。这次我们可以使用外键。例如:外密钥可以确保每个销售记录指向一定数量的一定数量顾客。
在这里,外部键可以将CustomerInfo表中的客户ID映射到Salesinfo表中的CustomerID。任何不能成为法律上客户的记录都不会遵循或插入Salesinfo。
请注意,该示例中的参数为“删除级联”。此参数可以确保将自动删除客户interfo表中的客户记录。如果您想在MySQL中使用外部键,则必须记住将表的类型定义为InnoDB类型时创建表时的类型。此类型不是MySQL表的默认类型。定义方法是将引擎= InnoDB添加到创建表语句。
7.锁桌
尽管交易是维护数据库完整性的一种很好的方法,但由于其垄断性,有时会影响数据库的性能,尤其是在大型应用程序系统中。由于数据库将在执行过程中锁定,因此其他用户请求可以可以仅临时等待直到交易结束。
如果仅在数据库系统中使用了少数用户,则交易的影响不会成为问题;响应延迟。
实际上,在某些情况下,我们可以通过锁定表来获得更好的性能。以下示例是锁定表以在上一个示例中完成交易功能的方法。
在这里,我们使用选择句子来获取初始数据,并使用一些计算将新值更新到表中使用Update语句。包含写关键字的锁定语句可以确保在Unlocktables命令之前没有其他访问权限被执行,并且将无法访问插入,更新或删除库存。
8.使用索引
索引是改善数据库性能的常见方法。他可以使数据库服务器比索引更快地检索特定行,尤其是当查询语句包含max(),min()和订单,性能,性能,性能,performanceImprovement时,更明显。
那这些领域呢?
一般而言,该索引应基于将用于加入的字段,判断和顺序。对于枚举类型字段,很可能重复。
例如,“省” ..客户Interinfo中的字段将没有任何帮助来在此类领域建立索引;相反,它也可能会降低数据库的性能。当我们创建一个表时,我们可以同时创建合适的索引,或者我们可以使用AlterTable或CreateIndex以后创建索引。
此外,MySQL支持完整的文本索引和从版本3.23.23中的搜索。全文索引是MySQL中的完整索引,但只能用于myisam类型。对于大数据库,将数据加载到一个没有FullText索引的表,然后使用AlterTable或CreateIndex创建索引的表将非常快。但是,如果将数据加载到带有FullText索引的表中,则执行过程将非常慢。
9.优化DE的查询语句
1请勿使用子问题示例:
在MySQL5.5版本中,执行了内部执行方案:首先检查外观,然后匹配内表,而不是检查内表T2。当出现外观很大时,查询速度将非常慢。
在Mariadb10/MySQL5.6版本中,它通过JOIN协会进行了优化。此SQL将自动将其转换为
但是请注意:优化仅对选择有效,更新/删除子问题的无效以及应避免稳固的生产环境
2避免功能索引:
由于MySQL不支持Oracle之类的功能索引,即使D字段具有索引,它也会直接扫描整个表。
应该更改为 - >
3用于替换或效率低下的查询
- >有效查询
4像双重分数不能用于索引
- >
目前,只有MySQL5.7支持完整的文本索引(支持中文)
5读取适当的记录限制m,n
- >
6避免不一致的数据类型
- >
7组统计数据可以禁止分类
默认情况下,mySQL按颜色为颜色的所有组的所有字段,如果查询包含组,并且如果要避免使用排序结果的消耗,则可以按null指定订单以禁止排序。
- >
8避免随机记录
mySQL不支持功能索引,这将导致全表扫描 - >
9通过排序禁止不必要的订单
- >
10批插入插入
- >
原始链接:https://blog.csdn.net/weixin_42047611/article/details/81772149