MYSQL优化与排错

MYSQL优化与排错

MySQL字段为什么要求定义为not null ?

null 值会占用更多的字节,且会在程序中造成很多与预期不符的情况。

简述MySQL 超大分页怎么处理 ?

超大的分页一般从两个方向上来解决.:
数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于select * from table where age > 20 limit 1000000,10这种查询其实也是有可以优化的余地的. 这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然比较慢. 当时我们可以修改为select * from table where id in (select id from table where age > 20 limit 1000000,10).这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快. 同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.
从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击.

MySQL中null与空值的区别 ?

1.占用空间区别:空值(’’)的长度是0,是不占用空间的;而的NULL长度是NULL,是占用空间的
2.插入/查询方式区别:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、<、>等算术运算符。
3.COUNT 和 IFNULL函数:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。
4.索引字段说明:在有NULL值的字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL

MySQL 如何优化 DISTINCT?

DISTINCT 在所有列上都转换为 GROUP BY,并将与 ORDER BY 子句结合使用。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

常见的 SQL 函数有哪些?

CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段组合成一个字段。
FORMAT(X, D) – 将数字 X 格式化为 D 有效数字。
CURRDATE(), CURRTIME() – 返回当前日期或时间。
NOW() – 将当前日期和时间作为一个值返回。
MONTH(), DAY(), YEAR(), WEEK(), WEEKDAY() – 从日期值中提取给定数据。
HOUR(), MINUTE(), SECOND() – 从时间值中提取给定数据。
DATEDIFF(A, B) - 确定两个日期之间的差异,通常用于计算年龄
SUBTIMES(A, B) – 确定两次之间的差异。
FROMDAYS(INT) – 将整数天数转换为日期值。

MySQL自增主键出现不连续的原因?

mysql自增主键不连续的情况原因有三个:

  1. 唯一键冲突
  2. 事务回滚
  3. insert…select的时候会出现主键id每次双倍分配导致主键id跳过的问题

MySQL的慢查询默认时间为多长?

10 S

MySQL中in 和exists的区别?

select * from A where id in(select id from B)
有两点区别:
(1) 使用上的区别:exists中放一个子查询有记录返回true,无记录返回false(NULL也算有记录),in中查询结果集只能有一个字段
(2) 性能上的区别:in要把缓存到内存中,exists不需要缓存结果
in()适合B表比A表数据小的情况
exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.

MySQL数据库服务器性能分析的方法命令有哪些?

Show status, 一些值得监控的变量值:
Bytes_received和Bytes_sent 和服务器之间来往的流量。
Com_*服务器正在执行的命令。
Created_*在查询执行期限间创建的临时表和文件。
Handler_*存储引擎操作。
Select_*不同类型的联接执行计划。
Sort_*几种排序信息。
Show profiles 是MySql用来分析当前会话SQL语句执行的资源消耗情况

MySQL中TEXT数据类型的最大长度

TINYTEXT:256 bytes
TEXT:65,535 bytes(64kb)
MEDIUMTEXT:16,777,215 bytes(16MB)
LONGTEXT:4,294,967,295 bytes(4GB)

MySQL5.7 与 MySQL8.0的差异?

  1. 功能
    NoSQL支持:
    MySQL 从 5.7 版本开始提供 NoSQL 存储功能,在 8.0 版本中这部分功能也得到了更大的改进。
    JSON:
    MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
    窗口函数:
    从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。
    窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。
    隐藏索引:
    在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用,我们可以使用这个特性用于性能调试。
    在创建完索引后,我们先将其隐藏,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可。如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
    降序索引:
    MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。
    通用表表达式式(Common Table Expressions CTE):
    在复杂的查询中使用嵌入式表时,使用 CTE 使得查询语句更清晰。
    UTF-8 编码:
    从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。
    支持表 DDL 的原子性:
    InnoDB 现在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性,要么失败回滚,要么成功提交,不至于出现 DDL 时部分成功的问题,此外还支持 crash-safe 特性,元数据存储在单个事务数据字典中。
    支持 crash-safe 特性:
    元数据存储在单个事务数据字典中。
    高可用性:
    InnoDB 集群为数据库提供集成的原生 HA 解决方案。
    caching_sha2_password 身份验证插件:
    caching_sha2_password是MySQL 8.0中的默认身份验证插件,替换了mysql 5.7的mysql_native_password,身份验证安全性能提升。
    授权
    与帐户管理相关的授权语法略有差异:
    MySQL5.7创建用户和用户授权命令可以同时执行
    grant all privileges on . to ‘Gary’@‘%’ identified by ‘Gary@2019’
    MySQL8.0创建用户和用户授权的命令需要分开执行
    创建用户
    create user ‘Gary’@‘%’ identified by ‘Gary@2019’;
    用户授权【给予所有权限】
    grant all privileges on . to ‘Gary’@‘%’
  2. 性能:
    根据官方说法,MySQL 8 要比 MySQL 5.7 快 2 倍。
    性能提升主要集中在三个领域:
    读写工作负载
    I/O密集型工作负载
    热点竞争问题工作负载。

简述MySQL数据库安全配置的常规设定 ?

  1. 强密码设置
    MySQL中强密码的设置非常重要,可以有效防止恶意攻击者通过猜测密码或暴力破解攻击进行入侵。
    1.1 密码复杂度设置
    可以通过修改my.cnf配置文件来设置密码复杂度,如下:
    [mysqld]
    validate_password_policy=STRONG
    validate_password_length=8
    其中,validate_password_policy指定使用哪种密码策略,可以设置为LOW(最低级,只要存在密码即可)、MEDIUM(中级,密码必须包含数字和字母)、STRONG(高级,密码必须包含数字、字母和特殊字符);validate_password_length指定密码的最小长度。
    1.2 密码复杂度提示
    在用户设置密码时,可以通过提示用户密码复杂度,来提醒用户设置更强的密码。
    [mysqld]
    validate_password_policy=STRONG
    validate_password_length=8
    validate_password_mixed_case_count=1
    validate_password_special_char_count=1
    其中,validate_password_mixed_case_count指定密码中必须包含的大小写字母数量,validate_password_special_char_count指定密码中必须包含的特殊字符数量。
  2. 权限控制
    为了防止恶意攻击者通过SQL注入等方式,进而随意操作数据库,需要在MySQL中配置权限控制策略。
    2.1 防止Root远程登录
    Root用户拥有最高的权限,不应该允许其在远程环境下进行登录。
    可以通过修改my.cnf配置文件来禁止Root用户远程登录,如下:
    [mysqld]
    skip-networking
    bind-address = 127.0.0.1
    其中,skip-networking表示禁止网络连接,bind-address表示绑定本地地址。
    2.2 新建用户及授权
    应该为每个应用程序或用户创建独立的MySQL用户,并分配相应的权限,以限制其对数据库的操作范围。
    例如,为某个应用程序创建用户:
    CREATE USER ‘app_user’@‘localhost’ IDENTIFIED BY ‘password’;
    GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.table_name TO ‘app_user’@‘localhost’;
    上述例子中,app_user表示新建用户的名称,由’@'localhost’指定了该用户能够从哪个IP地址访问MySQL服务器,SELECT、INSERT、UPDATE、DELETE指定了该用户在相应表格上的操作权限。
  3. 数据库备份与恢复
    定期的备份操作可以保护数据免受不良事件(如硬盘故障、误删除等)的影响,而灾难恢复能够保障遭受某些攻击时能够快速地恢复数据。
    3.1 数据库备份
    对于备份的数据库,建议采用mysqldump命令或xtrabackup工具进行备份操作。
    例如,对某个名为test的database进行备份:
    mysqldump -u root -p password test > /backup/test.sql
    以上列出了三个部分。第一个部分是命令本身(mysqldump),其后跟随一些命令选项。第二部分(-u root –p password)表示我们需要作为root用户进行连接,并将其加以密码授权。第三部分是操作目标(test database),并表示我们将把备份存储在 /backup/test.sql 文件中。
    3.2 数据库恢复
    对于已备份好的数据库,可以通过命令行工具或客户端软件进行恢复。
    例如,通过mysql命令恢复备份的数据库:
    mysql -u root -p test < /backup/test.sql

MySQL性能突然下降,如何思考排除 ?

在MySQL性能出现突然下降的情况下,我们需要找出具体原因,才能进行有效的调整和解决。其中,常见的性能下降原因有以下几种:
1.1. SQL语句的问题
全表扫描:当表中数据量大的时候,SQL查询语句中如果使用了全表扫描的方式,会导致性能下降。此时需要优化查询语句,尽可能使用索引、分区等方式来加速查询。
join语句问题:当查询中有join语句的时候,也容易出现性能下降的情况。针对这种情况,可以使用子查询、去掉不必要的字段、划分任务等方式进行优化。
临时表或者自定义函数:在SQL语句中使用了临时表或者自定义函数,也容易造成性能下降的情况,需要进行优化。
1.2. 数据库配置问题
参数设置不当:在MySQL配置中,参数设置不当也容易导致性能下降,特别是一些缓存参数和连接参数的设置。可以通过查看日志和参数调整来优化配置。
内存不足:当MySQL所在的服务器内存不足的时候,也容易导致性能下降的情况。需要检查服务器内存情况,增加内存或者减少MySQL占用的内存等方式进行优化。
1.3. 硬件问题
硬盘故障:当MySQL所在的硬盘发生故障的时候,也会导致性能下降。特别是当硬盘的I/O读写速度降低的时候,需要及时对其进行维修或更换。
网络问题:当MySQL所在的服务器与客户端之间的网络出现故障的时候,也会导致性能下降。可以通过检查网络连接和网络传输速度来进行优化。
2. 解决方法
在分析出MySQL性能下降的原因之后,接下来就是针对性地解决问题。
2.1. SQL语句优化
索引加速查询:对查询中经常使用的列加索引,能够大大缩短查询时间。
避免子查询:尽量不要使用子查询,如果一定需要使用,可以将其转为内连接或者外连接的方式进行优化。
慢查询日志查看:通过开启MySQL的慢日志,并查看慢查询日志进行SQL语句的优化。
2.2. 配置优化
缓存参数调整:根据实际情况修改MySQL参数(例如:innodb_buffer_pool_size、innodb_log_file_size、key_buffer_size等)。
连接数限制:根据服务器硬件配置,合理调整MySQL的最大连接数。
内存优化:将MySQL所占用的内存与服务器总内存进行协调。
2.3. 硬件优化
硬盘检查和优化:通过检查硬盘状态,调整磁盘分区和使用磁盘缓存等方式进行优化。
网络检查和优化:通过检查网络连接和传输速度,调整网络参数等方式进行优化。

综合阐述MySQL性能瓶颈排查定位实例详解?

MySQL是一款常用的数据库管理系统,如何提升MySQL的性能,是运维工程师面临的重要问题之一。在实际开发及运维工作中,经常遇到MySQL性能瓶颈的问题。解决MySQL性能瓶颈,首先需要了解瓶颈的产生原因。本文将详细讲解MySQL性能瓶颈排查定位实例,并提供两条示例。
一、MySQL性能瓶颈的排查定位实例
1.1 慢查询日志的排查定位
慢查询日志是MySQL提供的用于记录查询时间超过阈值的SQL语句的日志。使用慢查询日志可以方便的找出哪些SQL语句导致了性能问题。
1.1.1 慢查询日志开启
MySQL慢查询日志的开启方法,可以通过修改my.cnf配置文件实现。在[mysqld]下添加以下参数:
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow_query.log
long_query_time=5
说明:

  • slow_query_log:设置是否开启慢查询日志,1为开启,0为关闭,默认为0。
  • slow_query_log_file:设置慢查询日志的保存文件路径。
  • long_query_time:设置慢查询的最大执行时间。单位为秒,默认为10秒。
    修改完成后,需要重启MySQL服务。
    1.1.2 慢查询日志分析工具
    MySQL提供了一个名为mysqldumpslow的工具,可以用于分析慢查询日志。使用mysqldumpslow可以获取慢查询日志中的SQL语句、执行次数和执行时间等信息。
    使用示例:
    mysqldumpslow /var/log/mysql/slow_query.log
    结果示例:
    Count: 60 Time=100.01s (6001s) Lock=0.00s (0s) Rows=0.0 (0), example SQL
    说明:
  • Count:执行次数。
  • Time:执行时间。
  • Lock:锁等待时间。
  • Rows:所影响的行数。
    1.1.3 慢查询日志分析实例
    我们可以通过慢查询日志分析工具找到响应最慢的SQL语句。例如,下面是一个执行时间较长的SQL语句:
    select t.* from table1 as t inner join table2 as t2 on t.id=t2.id where t.id>1000 order by t.id limit 0,10;
    SQL语句的执行时间较长,我们可以尝试优化该SQL语句,例如添加索引或修改查询方式等。
    热门推荐:
    PDF电子发票识别软件,一键识别电子发票并导入到Excel中!
    10大顶级数据挖掘软件!
    人工智能的十大作用!
    1.2 MySQL死锁的排查定位
    MySQL的死锁是指两个或两个以上的事务,由于竞争资源而相互等待的状态。死锁在高并发的场景下经常出现,解决MySQL死锁问题对于提升系统性能至关重要。
    1.2.1 查看死锁日志
    MySQL提供了查看死锁的工具,可以通过以下SQL语句查看死锁:
    show engine innodb status\G;
    执行该命令后,可以在输出结果中查看到死锁的信息。例如:

LATEST DETECTED DEADLOCK

YY-MM-DD HH:MM:SS
*** (1) TRANSACTION:
TRANSACTION 170744, ACTIVE 0 sec fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1
MySQL thread id 5625, OS thread handle 0x2b094670b700, query id 1891386 localhost root executing
SELECT * FROM xxx WHERE id=xxx lock in share mode
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id xxx page no xxx n bits 80 index PRIMARY of table xxx trx id 170744 lock_mode X locks rec but not gap waiting
Record lock, heap no xxx PHYSICAL RECORD: n_fields xxx; column1 value; column2 value; …
输出结果中提供了死锁的相关信息,包括死锁的时间、事务ID等。
1.2.2 死锁排查实例
如果系统出现了死锁现象,可以通过查看死锁日志的方式解决问题。例如,以下SQL语句在执行时可能出现死锁的情况:
update xxx set value=value+100 where id=xxx;
如果出现死锁的情况,可以尝试将其拆解成两个步骤:
select value from xxx where id=xxx for update;
update xxx set value=xxx+100 where id=xxx;
这样可以避免两个事务同时修改同一条记录导致死锁的情况。
结语
MySQL的性能瓶颈问题往往需要针对具体的业务场景和数据库结构进行排查和定位。在实际工作中,可以参考以上两个示例,快速排查和解决MySQL的性能瓶颈问题。

MySQL如何快速插入千万级大数据 ?

1.使用LOAD DATA方式批量导入数据
LOAD DATA是MySQL提供的一个非常快速的方式,可以一次性导入成千上万条记录。语法如下:
LOAD DATA LOCAL INFILE ‘data.txt’ INTO TABLE table_name
FIELDS TERMINATED BY ‘,’
LINES TERMINATED BY ‘\n’
(col1, col2, col3…);
其中,data.txt是你要导入的数据文件,第2行到第6行分别指定了文件的编码方式、字段分隔符、行分隔符和字段列表。需要注意的是,如果文件中的数据列数与FIELDS关键字后的字段数不一致,会导致导入失败。
使用这种方式时,需要在MySQL客户端中设置local-infile=1,才能从本地文件系统读取数据。
示例1:假设有一个包含100万条记录的CSV文件data.csv,文件格式如下:
id,name,age,gender
1,Tom,20,Male
2,Mary,25,Female
3,John,30,Male

我们可以执行以下SQL语句将这些数据批量导入到数据库中:
LOAD DATA LOCAL INFILE ‘data.csv’ INTO TABLE users
FIELDS TERMINATED BY ‘,’
LINES TERMINATED BY ‘\n’
(id, name, age, gender);
在这个例子中,我们将CSV文件中的字段分隔符、行分隔符和字段列表与表的信息一一对应,然后通过LOAD DATA语句将数据直接插入到MySQL表中。
2.使用INSERT INTO SELECT语句插入数据
另一种快速插入数据的方式是使用INSERT INTO SELECT语句,可以将数据从一个表中复制到另一个表中。语法如下:
INSERT INTO table1 (col1, col2, …)
SELECT col1, col2, …
FROM table2;
其中,table1为目标表,table2为源表,要插入的列在括号中列出。这种方式可以用来复制数据、双方表结构完全一致,如果要向目标表中插入新的数据列,需要先对目标表执行ALTER TABLE语句来添加新的列。

何使用MySQL Slow Log来解决MySQL CPU占用高的问题 ?

使用MySQL Slow Log来解决MySQL CPU占用高的问题,可以通过以下步骤实现:

  1. 开启MySQL Slow Log
    在MySQL配置文件(一般为my.cnf或者my.ini)中开启slow_query_log,并且设置slow_query_log_file,如下所示:
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/mysql-slow.log
    设置完毕后,重启MySQL服务即可生效。
    此时,MySQL会将执行时间超过long_query_time秒的查询语句记录在slow_query_log_file中。
  2. 分析Slow Log
    通过分析slow_query_log文件,可以了解MySQL中哪些查询语句执行效率过低,从而引起CPU占用高问题。使用mysqldumpslow工具可以对slow_query_log文件进行分析,示例代码如下:
    mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
    其中,-s c表示按照执行次数排序,-t 10表示输出前十个查询语句。
    通过分析输出结果,可以找出哪些查询语句频繁执行,且执行时间比较长,进而分析原因。
  3. 优化查询语句
    针对分析出来的Slow Log中的查询语句,可以结合实际情况进行相应的优化。

MySQL 如何优化SQL查询语句?

建议性操作方案如下:
1:避免全表扫描
考虑在 where 和 order by 涉及的列上建立索引,in 和 not in 也要慎用,尽量用 between 取代。
2:优化 COUNT 查询
count 可以统计列的数量,统计列值时要求列非空;COUNT 还可以统计行数,当 MySQL 确定括号内的表达式不可能为 NULL 时,实际上就是在统计行数。当使用 COUNT(*) 时,会忽略所有列而直接统计行数。
某些业务场景不要求完全精确的 COUNT 值,此时可以使用近似值来代替,EXPLAIN 估算的行数就是一个不错的近似值。
3:避免子查询
在 MySQL5.5 及以下版本避免子查询,因为执行器会先执行外部的 SQL 再执行内部的 SQL,可以用关联查询代替。
4:禁止排序
当查询使用 GROUP BY 时,结果集默认会按照分组的字段进行排序,如果不关心顺序,可以使用 ORDER BY NULL 禁止排序。
5:优化分页
在偏移量非常大的时候,需要查询很多条数据再舍弃,代价非常高。最简单的优化是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后做关联操作再返回所需的列。还有一种方法是从上一次取数据的位置开始扫描,避免使用 OFFSET。
6:优化 UNION
MySQL 通过创建并填充临时表的方式来执行 UNION 查询,除非确实需要消除重复的行,否则使用 UNION ALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,对整个临时表的数据做唯一性检查,代价非常高。
7:使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器,在连接 MySQL 的整个过程中都存在,可以在任何可以使用表达式的地方使用自定义变量,避免重复查询刚刚更新过的数据

述优化MySQL数据库的方法?

1、选取合适的字段属性
MySQL支持大数据的储存,但是一般来说,数据库中的表越小查询速度越快,所以在建表的时候尽量将表的宽度设小,另一个就是在尽可能的情况下把字段设置为NOTNULL
2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始就支持SQL子查询,他可以使用SELECT语句来创建一个单列的查询结果,然后将这个结果作为过滤条件用在另一个查询中比如
SELRCT FROM ** WHERE *** NOT IN(SELECT *** FROM *)
如果使用连接(JOIN)来做查询回快很多尤其使查询字段中有索引的情况下
3、使用联合(UNION)来代替手动创建的临时表
MYSQL从4.0开始支持UNION查询,它可以把需要的使用临时表的select(两条及以上)的select查询合并到一个查询中。在客户端查询会话结束之后,临时表回会自动删除,使用UNION创建查寻时,只需要把UNION作为关键字将多个select语句连接起来(select中的字段数目要相同)
SELECT Name,Age FROM one UNION
SELECT Name,Phone FROM two UNION
SELECT Name,emile FROM three
4、事务
虽然我们可以使用子查询(Sub-Queries)、连接(JIOIN)联合(UNION)来来创建各种查寻,但并不是所有的数据库操作都是可以用一条或几条SQL语句就可以完成的,大多时候我们都需要一系列的语句来完成某种工作,当同时对两个关联表操作时可能会出现一条语句操作成功后,数据库库突然出现意外,第二个没有执行成功,这样就造成数据的不完整,甚至破坏数据中的数据,为了避免发生这种情况,我i们就应该使用事务,他的作用就是,要么全成功,要么全失败,可以保证数据库的一致性和完整性
事务是以BEGIN关键字开始,以COMMIT关键字结束,在这之间的的SQL操作只要一条失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。事务还有一个重要的作用就是当多用户同时操作相同的数据源时,它可以利用锁定数据库的方法来为客户提供安全访问方式,保证用户操作不被其他用户干扰。
5、锁定表
虽然事务是维护数据库完整性的一个好方法,但是它具有独占性,有时候会影响数据库的性能所以我们可以通过使用锁定表表来实现更好的性能,使用有WRITE关键字的sql语句可以保证在UNLPCKTABLES命令执行前,不会有其他的对该表的插入,更新删除操作
LOCK TABLE one WRITE SELECT Name FROM one WHERE Age=11;

UPDATE one SET Name =“王五” WHERE Age=16; UNLOCKTABLES
6、使用外键
锁定表方法可以维护数据的完整性,但是不能确保数据的关联性。这时候我们可以使用外键。
CREATE TABLE customerinfo ( CustomerIDINT NOT NULL, PRIMARYKEY ( CustomerID ) ) TYPE = INNODB;
CREATE TABLE salesinfo (
SalesIDNT NOT NULL,
CustomerIDINT NOT NULL,
PRIMARYKEY ( CustomerID, SalesID ),
FOREIGNKEY ( CustomerID ) REFERENCES customerinfo ( CustomerID ) ON DELETE CASCADE
) TYPE = INNODB;
注意一定要使用参数ON DELETE CASCADE保证数据的一致性,使用外键时在创建表的时候一定要将表的类型定义为事务安全表InnoDB类型。
7、使用索引
建立索引是提高数据库性能的常用方法,它可以使数据库比没有索引快的多的速度检索特定的行,尤其实在有序的情况下性能会更好。
建立索引的时候尽量建在将用于JOIN,WHERE和ORDERBY排序的字段上,尽量不要在含有大量重复的值的字段建立索引
8、优化查询语句
搜索字符型字段时减少使用LIKE关键字和通配符
尽量不要使用自动类型转换
不要在列上进行运算,
不使用NOT IN和<>操作

MySQL如何使用Explain优化SQL和索引?

对于复杂、效率低的sql语句,我们通常是使用explain sql 来分析sql语句,这个语句可以打印出,语句的执行。这样方便我们分析,进行优化
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
all:full table scan ;MySQL将遍历全表以找到匹配的行;
index: index scan; index 和 all的区别在于index类型只遍历索引;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值的行,常见与between ,等查询;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;
const,system:当MySQL对某查询某部分进行优化,并转为一个常量时,使用这些访问类型。如果将主键置于where列表中,MySQL就能将该查询转化为一个常量。
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MySQL认为必须检查的用来返回请求数据的行数
Extra:关于MySQL如何解析查询的额外信息。

MySQL 如果某个表有近千万数据,CRUD比较慢,如何优化 ?

分库分表
某个表有近千万数据,可以考虑优化表结构,分表(水平分表,垂直分表),当然,你这样回答,需要准备好面试官问你的分库分表相关问题呀,如
分表方案(水平分表,垂直分表,切分规则hash等)
分库分表中间件(Mycat,sharding-jdbc等)
分库分表一些问题(事务问题?跨节点Join的问题)
解决方案(分布式事务等)
索引优化
除了分库分表,优化表结构,当然还有所以索引优化等方案~

MySQL thread_stack连接线程的优化策略 ?

MySQL 的 thread_stack 参数用于配置连接线程的最大栈空间大小,是一个影响 MySQL 运行性能的重要参数。在高并发、大数据量场景下,可通过调整该参数来优化 MySQL 的连接线程,提升系统的性能和稳定性。
下面是一个完整的 MySQL thread_stack 连接线程优化攻略,包括调整步骤和示例说明。
步骤一:查看默认 thread_stack 值
在执行任何调优操作之前,先要查询 MySQL 当前的 thread_stack 参数值,并记录下来,以便后续比较分析。
SHOW variables LIKE ‘thread_stack’;
默认情况下,thread_stack 参数值为 262144,即 256 KB。
步骤二:确定合适的 thread_stack 大小
合适的 thread_stack 大小需要结合服务器的硬件配置、数据量、负载情况等因素进行综合考虑。通常情况下,我们建议将 thread_stack 参数设置为 512 KB 或 1024 KB,以便处理大数据查询、复杂查询和连接池等高并发负载,提高系统的稳定性和响应速度。
可以根据当前服务器的硬件资源分配情况,动态调整 thread_stack 参数,以适应 MySQL 运行要求。
步骤三:修改 thread_stack 参数
可以通过下面的 SQL 语句来修改 MySQL 的 thread_stack 参数:
SET GLOBAL thread_stack = 1048576; – 1MB
注意:使用 SET GLOBAL 命令修改全局变量时,可能会影响到系统的稳定性和性能。建议在测试环境中进行验证,或者在繁忙时段操作时备份数据,以确保数据安全和服务质量稳定。

MYSQL 如果发现CPU,或者IO压力很大,怎么定位问题?

1、首先我会用top命令和iostat命令,定位是什么进程在占用cpu和磁盘io;
2、如果是mysql的问题,我会登录到数据库,通过show full processlist命令,看现在数据库在执行什么sql语句,是否有语句长时间执行使数据库卡住;
3、执行show innodb engine status命令,查看数据库是否有锁资源争用;
4、查看mysql慢查询日志,看是否有慢sql;
5、找到引起数据库占用资源高的语句,进行优化,该建索引的建索引,索引不合适的删索引,或者根据情况kill掉耗费资源的sql语句等

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值