Code前端首页关于Code前端联系我们

开发mysql数据库的经验,数据库开发中遇到的问题

terry 2年前 (2023-09-30) 阅读数 44 #Mysql
文章标签 Mysql

本文内容列表:

  • 1、刚开始学习mysql数据库,不太了解客户端和服务端。这里的服务器是通过网络连接访问的还是已经安装的?
  • 2.要求高手优化MySQL数据库。数据库响应太慢。
  • 3、mysql建表的问题
  • 4.《深入浅出MySQL数据库开发优化与管理维护第3版》pdf下载并在线阅读全文,请搜索百度网盘云资源
  • 5、北大青鸟设计培训:Mysql数据库的设计与优化?

我刚开始学习mysql数据库,不太了解客户端和服务端。这里的服务器是需要通过网络连接访问,还是已经安装好?

1。首先我们来解释一下服务器端和客户端的区别。服务器是指安装了mysql的机器,客户端通过网络远程使用服务器上的mysql。客户端通过学习远程服务器的IP地址和mysql的一些密码信息来使用。 MySQL 数据库

2。解释一下数据库是一种什么样的存在。当你安装某个特定的数据库时,你会配置一些系统信息,然后设置某些连接到机器硬件的端口,比如内存,这样通过这些端口你可以先将存储的信息存储到存储空间中,并建立一个数据库是按照某些代码定义的方式创建一些用于存储数据的空间(mysql)。这样,每个数据库实际上就是一个存储数据的存储库。

3。创建表的原理其实就是在你创建的数据库存储空间中继续为每个表分配空间,然后在每个表中存储数据

4。还有你上面所说的通过写几行代码来创建一个表格,你实际上是使用代码然后将其翻译成机器语言,让计算机分配一些存储并编译成你想要的某种形式的表格显示样式响应可以看到。事实上,可以这么说,它只是一个房间。你明白吗? ?

打了很多电话,如果明白请采纳,谢谢

请高手优化MySQL数据库,数据库响应太慢。

在演示开始之前,我们先介绍一下接下来的两个概念。

概念1,数据的可选基础,通常称为基数值。

在生成不同的执行计划之前,查询优化器必须首先从统计信息中获取相关数据,以便能够估计每个操作所涉及的记录数,这个相关数据就是基数。简而言之,就是每个字段中每个值的唯一的值分配方式。

例如,表t1有100行记录,其中一条记录是f1。 f1中唯一值的数量可以是100或1,当然也可以是1到100之间的任意数字。这里唯一的值是该列的可选基数。

当我们看到这一点时,我们就会明白为什么在高基数字段上创建索引是必要的,而对低基数字段建立索引却没有全表扫描快。这当然只是一方面,更深入的讨论超出了本文的范围。

概念2,关于HINT的使用。

这里我来解释一下什么是TIP以及何时使用它。

TIP只是在某些特定场景下手动辅助MySQL优化器,让她生成最优的执行计划。一般来说,优化器的执行计划是最优的,但在某些特定场景下执行计划可能不是最优的。

例如:表t1经过大量频繁的更新操作(UPDATE、DELETE、INSERT),基数已经非常不准确。此时恰好执行了一些SQL,因此该SQL的执行计划可能不是最优的。的。为什么可能呢?

我们来看看具体演示

例如下面两条SQL,

A:

select * from t1 where f1 = 20;

B:

select * from t1 where f1 = 30;

如果f1的值恰好频繁更新到30,并且没有达到MySQL自动更新基数值或用户集的临界值手动更新,或者用户减少示例页面等等,所以对于这两个元素。从表述上来说,可能不准确的是B。

顺便说一句,MySQL提供了自动更新和手动更新表基数值的方法。由于篇幅有限,如有需要请参阅手册。

回到正题,MySQL 8.0带来了几个TIPS。今天我举一个index_merge的例子。

表结构示例:

mysql desc t1;+------------------------+----------------+-----+---- ----- +----------------+|领域 |类型 |零|关键|标准|额外 |+------------+ ---------------+-----+-----+----- ----+------------ ----+|编号 |整数(11)|否 |优先原则 |空|自动增量 ||排名1 |整数(11)|是 |乘法 |空| |排名 2 |整数(11)|是 |乘法 |空| ||日志时间 |日期和时间 |是 |乘法 |空 | | |前缀_uid | varchar(100) | varchar(100) |是 | |空 | | |空 | ||排名 3 |整数(11)|是 |乘法 |空 | +------------+--------------+------+-----+-------- - - +----------------+集合中的 7 行(0.00 秒)

表条目数:

mysql select count(*) from t1;+ - - ---------+|计数(*) |+----------+| 32768 |+----------+1 行集合(0.01 秒)

这里我们有两个经典 SQL:

SQL C:

select * from t1 whererank1 = 1 或者rank2 = 2 或者rank3 = 2;

SQL D:

select * from t1 whererank1 =100 andrank2 =100 andrank3 =100;

表t1实际上是每个rank1、rank2 和rank3 列上的二级索引。

那么我们看一下SQL C的查询计划。

很明显没有使用索引,扫描的行数为32034,成本为3243.65。

mysql 解释 format=json select * from t1 其中rank1 = 1 或rank2 = 2 或rank3 = 2\G**************************** * * * 第一行 ******************************解释: { "query_block": { "select_id": 1, " cost_info": { "query_cost": "3243.65" }, "table": { "table_name": "t1", "access_type": "ALL", "possible_keys": [ "idx_rank1", "idx_rank2", "idx_rank3 ” ],“ rows_examined_per_scan”:32034,“rows_productd_per_join”:115,“过滤”:“0.36”,“cost_info”:{“read_cost”:“3232.07”,“eval_cost”:“11.58”,“前缀”“3.6” data_read_per_join ": "49K" }, "used_columns": [ "id", "rank1", "rank2", "log_time", "prefix_uid", "desc1", "rank3" ], "attached_condition": "((` ytt `.`t1`.`rank1` = 1) 或 (`ytt`.`t1`.`rank2` = 2) 或 (`ytt`.`t1`.`rank3` = 2))" } }} 1 行一组,1 次警告(0.00 秒ec) 我们向同一查询添加提示并再次查看查询计划。

此时使用index_merge来连接三列。扫描的行数为1103,价格为441.09,明显比之前快了好几倍。

mysql解释format=json select /*+index_merge(t1)*/*fromt1whererank1=1或rank2=2或rank3=2\G**************** ** ******第一行********************************解释:{“query_block”:{“select_id” :1,“cost_info”:{“query_cost”:“441.09”},“table”:{“table_name”:“t1”,“access_type”:“index_merge”,“possible_keys”:[“idx_rank1”,“idx_rank2” ,“idx_rank3”],“键”:“联合(idx_rank1,idx_rank2,idx_rank3)”,“key_length”:“5,5,5”,“rows_examined_per_scan”:1103,“rows_productd_per_join”:1103,“过滤”:“ 100.00", "cost_info": { "read_cost": "330.79", "eval_cost": "110.30", "prefix_cost": "441.09", "data_read_per_join": "473K" }, "used_columns": [ "id" , "rank1", "rank2", "log_time", "prefix_uid", "desc1", "rank3" ], "attached_condition": "((`ytt`.`t1"`.`rank1` = 1) 或 (`ytt`.`t1`.`rank2` = 2) 或 (`ytt`.`t1`.`rank3` = 2))" } }}集合中的 1 行, 1 个警告(0.00 秒)让我们看一下 SQL D 的计划:

No HINT,

mysql 解释 format=json select * from t1 其中rank1 =100 且rank2 =100 且rank3 =100\G**************************** * * *** 第一行 ******************************解释: { "query_block": { "select_id": 1 , "cost_info " : { " query_cost": "534.34" }, "table": { "table_name": "t1", "access_type": "ref", "possible_keys": [ "idx_rank1", "idx_rank2", " idx_rank 3"],"key":"idx_rank1","used_key_parts":["rank1"],"key_length":"5","ref":["const"],"rows_examined_per_scan":555,"rows_productd_per_join" :0,“过滤”:“0.07”,“cost_info”:{“read_cost”:“478.84”,“eval_cost”:“0.04”,“prefix_cost”:“534.34”,“data_read_per_join”:“176”},“ used_columns": [ "id", "rank1", "rank2", "log_time", "prefix_uid", "desc1", "rank3" ], "attached_condition": "((`ytt`.`t1`.`rank3` = 100) 和 (`ytt`.`t1`.`rank2` = 100))" } }}集中 1 行,1 个警告 (0 .00 秒)添加了提示,

mysql 解释 format=json select /*+ index_merge(t1)*/ * from t1 whererank1 =100 andrank2=100andrank3=100\G**************** *** ****** 第一行 ******************************解释: { "query_block": { "select_id " : 1、“cost_info”:{“query_cost”:“5.23”}、“table”:{“table_name”:“t1”、“access_type”:“index_merge”、“possible_keys”:[“idx_rank1”、“idx_rank2”、 “idx_rank3”],“键”:“相交(idx_rank1,idx_rank2,idx_rank3)”,“key_length”:“5,5,5”,“rows_examined_per_scan”:1,“rows_productd_per_join”:1,“过滤”:“100.00 ”,“cost_info”:{“read_cost”:“5.13”,“eval_cost”:“0.10”,“prefix_cost”:“5.23”,“data_read_per_join”:“440”},“used_columns”:[“id”,“排名1”,“排名2”,“log_time”,“prefix_uid”,“desc1”,“排名3”],“attached_condition”:“((`ytt`.`t1`.`rank3”` = 100) 和 (`ytt`.`t1`.`rank2` = 100) 和 (`ytt`.`t1`.`rank1` = 100))" } }}集合中有 1 行,1 个警告 (0 .00秒)对比上面两者,添加TIP的成本比不添加TIP的成本低100倍。

总结一下,就是表的基数值影响了该表的查询计划。如果这个值一般不会更新,需要手动添加TIP,我想以后的MySQL版本会提供更多的TIPS。

关于mysql建表的问题

推荐第一个选项。

尽量避免第二种选择。

(1)大量的数据条目对于mysql来说根本不是问题。我的项目中的数据库记录数量超过1亿条。

(2)组合主键很好,检索时会很方便。由于您关心的是记录数,这意味着这两个表密切相关。以后的检索很可能是根据b表的ID等等。

(3)不仅是检索,而且维护起来,使用A方案非常方便,这方面我有过教训。

当a和b的表关系发生变化时,更新逗号分隔数据的需求就变得很多。小心。

您是否删除了1、2、3之间的2,取出整个字符串并替换2。

如果数据很多,替换操作要非常非常小心。

(4)如果其他选项是通过后,在演示过程中需要采取进一步的拆分操作。虽然这个动作并不复杂,但是每次分裂都非常烦人。

《深入浅出MySQL数据库开发优化与管理维护第3版》pdf下载在线阅读全文请询问百度网盘云资源

《深入浅出MySQL数据库开发优化与管理维护第3版》百度网盘pdf最新全套下载:

链接:

?pwd=grx5 提取码:grx5

简介:《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》是网易多位资深数据库专家多年总结和使用MySQL数据库的经验得出的。在之前版本的基础上,内容基于MySQL 5.7版本进行了升级,也体现了MySQL 8.0的重要性。功能介绍。本书除了更新原有内容外,还增加了作者在高可用架构、数据库自动化运维、数据库中间件等方面的实践和积累。

《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》分为“基础”、“开发”、“优化”、“管理与维护”、“架构”5个部分,共32章。基础章节针对MySQL初学者,介绍MySQL的安装与配置、SQL基础知识、MySQL支持的数据类型、MySQL中的运算符、常用函数等。开发章节针对MySQL设计者和开发者。内容涵盖表类型(存储引擎)的选择、合适数据类型的选择、字符集、索引设计和使用、常用数据库对象的开发、事务控制和锁定语句、SQL安全问题、SQL状态及相关问题、MySQL优化章节针对的是开发人员和数据库管理员,内容包括SQL优化、锁定问题、MySQL Server优化、磁盘I/O问题、应用程序优化、PS/SYS数据库、错误诊断等。管理维护章节是适合数据库管理员阅读。介绍MySQL高级安装与升级、MySQL中常用工具、MySQL日志、备份与恢复、MySQL权限与安全、MySQL监控、MySQL常见问题与应用技巧、自动化运维系统。开发等内容。架构章节主要面向高级数据库管理人员和数据库架构设计人员,涵盖MySQL复制、高可用架构、MySQL中间件等。

北大青鸟设计培训:Mysql数据库设计与优化?

JAVA开发中我们还需要了解数据库的学习。下面的文章都是关于数据库的设计和使用的。那么话不多说,让我们开始向Java课程培训机构学习吧!数据库设计 数据库设计是基础,数据库优化是基于设计的。

一个好的数据库必须有好的设计。

数据库设计的目标是为用户和各种应用系统提供信息基础设施和高效的运行环境。

数据库的三大范例。第一范式1NF:所有字段必须是原子的,即数据库表中的每一列都是不可分割的原子数据元素,不能是集合、数组、记录等非原子数据项。

第二范式2Nf:第二范式是在第一范式的基础上进一步发展的。

第二种范式是保证数据库表中的每一列都与主键相关,而不仅仅是与主键的特定部分相关(主要针对共享主键)。

即数据库表中,一张表中只能存储一种类型的数据,同一个数据库表中不能存储多种类型的数据。

第三范式3Nf:所有字段必须与主键直接相关,而不是间接相关。

也可以理解为字段不应该与其他非主键字段相关。注意:这三种范式应该尽量遵循,不必墨守成规。这只是为了让我们设计表格。越接近这些范式,领域就越接近。尽可能减少冗余。但有时你可以根据实际需要稍微违反一下。然而,违反第三范式是可以接受的,但不能违反第一范式。数据库设计需求分析阶段的步骤准确理解和分析用户需求(包括数据和处理)。

是整个设计过程的基础,也是最困难、最耗时的一步。

概念结构设计阶段是整个数据库设计的关键——设计数据库E-R模型图,确认所需信息的正确性和完整性 Entity_Relationship ---实体之间的关系 一对一 一对一许多 多对一

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门