MySql优化

MySQL数据库优化

数据库文件

  1. mysiam引擎
    a. xxx.frm : 表结构文件
    b. xxx.MYD : 表数据文件
    c. xxx.MYI : 表索引文件

  2. innodb引擎

MySQL优化步骤

发现问题

1.1 开启mysql慢查询功能

	在mysql的配置文件my.ini(mysql的安装目录下) 配置:
			慢查询记录SQL的文件地址
			log-slow-queries = D:/server/mysql/mysqlslowquery.log
			超过1秒的SQL会记录到上面的文件中
			long_query_time = 1

命令行模式设置

#是否开启慢查询
show variables like '%slow_query_log';
#开启慢查询
set global slow_query_log='ON';
#查询时间阀值
show variables like '%long_query_time%';
#设置时间阀值
set global long_query_time = 3;
1.2 开启时间:

	系统刚上一周开启慢查询
	如果客户反馈系统比较慢的情况下.建议也开启一段时间. 

查找问题

2.1 执行命令:

  explain SQL语句 \G      	(G代表竖向显示)
使用 SHOW PROFILE 查看 SQL 的具体执行成本
# 查看
 show variables like 'profiling';
# 设置
set profiling = 'ON';
# 当前会话都有哪些 profiles
show profiles;
# 查看上一个查询的开销
show profile;

统计查询日志:
可以使用 MySQL 自带的 mysqldumpslow 工具统计慢查询日志(这个工具是个 Perl 脚本,你需要先安装好 Perl)。

mysqldumpslow 命令的具体参数如下:

-s:采用 order 排序的方式,排序方式可以有以下几种。
分别是 c(访问次数)、t(查询时间)、l(锁定时间)、r(返回记录)、ac(平均查询次数)、al(平均锁定时间)、ar(平均返回记录数)和 at(平均查询时间)。其中 at 为默认排序方式。

-t:返回前 N 条数据 。

-g:后面可以是正则表达式,对大小写不敏感。

#  示例
perl mysqldumpslow.pl -s t -t 2 "C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-4BK02RP-slow.log"

2.2 看看是否使用到索引,主要看两个指标:
type: ALL(全表扫描,没有使用到索引) ,
possible_keys: 可能使用到的索引, null(说明没有使用索引)
keys: null(说明没有使用索引)

解决问题

  1. 硬件升级

  2. 添加索引(最简单的方式)

    索引的原理: btree是其中的一种

    2.1 添加主索引 主键在一个表中只能够有一个, 主键索引的效率也是最高的.

    1). 创建表时指定主键
    create table 表名(列名 类型 primary key)
    2). 创建表后指定主键
    alter table 表名 add primary key(列)

    1. 2 添加唯一索引

      1. 在创建时添加

        在字段后添加 unique 表示唯一键 create table 表名(字段 类型 unique)

      2. 在创建后添加

        语法 create unique index 索引的名字 on 表名(列名)

        注:a. 一个表中可以有多个唯一性索引
        b. 数据不重复的列可以使用唯一性索引.

      2.3 添加普通索引

      在创建表时创建

        create table 表名(列名 类型,列名 类型 ,key(列名)|index(列名))
      

      在创建表后创建

      create index 索引的名字 on 表名(列名)

        alter table 表名 add index(列名)
      

      删除索引

      DROP INDEX 索引名 ON 表;
      ALTER TABLE 表名 DROP INDEX 索引名;

    使用索引注意事项:

    1. 频繁使用的字段适合建立索引

    2. 唯一性差的字段不适合建立索引

    3. 经常更改的字段不适合建立索引

    4. 不出现在where语句中的字段不适合建立索引

    索引的缺点: 增删改速度慢

  3. 优化sql语句

    1. 对于复合索引的列,在条件中一定要使用最左边的列

    2. 对于like模糊查询

      %或者_ 在关键字的前面是无法使用索引的,只有在后面才能使用

    3. 如果where语句中出现or,建议or两边都是用索引,否则将会进行全盘扫描

    4. 如果一个字段的类型为字符串,必须使用""将值引起来,来能使用索引

    5. 使用连接查询取代子查询。因为子查询会在内存中创建一个临时的表,占用内存空间。

    6. 在导入大量数据时,关闭索引建立

      对于MyISAM:

      alter table table_name disable keys;

      执行insert语句导入

      alter table table_name enable keys;

      对于Innodb:

      1, 将要导入的数据按照主键排序

      2,set unique_checks=0,关闭唯一性校验。

      3,set autocommit=0,关闭自动提交。

    7. 使用正确的字段类型

      1. 在需求满足的情况下,尽量使用小的类型
      2. 在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性。使用decimal 不要用float
    8. 对存储引擎是MyISAM的表,要定时碎片整理

  4. 分表与分区技术

    4.1 垂直分表技术

    所谓垂直分割,就是把表的某个大字段(而且很少查询),单独的取出,放入到另外一个表,并通过id关联.

    4.2 水平分表技术

    4.3 分区技术

  5. 修改配置文件(性能提升很小)

    数据库my.ini配置

  6. 定时维护数据库,备份

    #windows下的可执行文件
    @echo off
    set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%"
    #mysql执行命令
    mysqldump -uroot -padmin ajaxdemo >d:/ajaxdemo_%Ymd%.sql
    @echo on
    
    

mysql查询表的结构

select COLUMN_NAME,COLUMN_COMMENT from information_schema.COLUMNS where TABLE_SCHEMA = (select database()) and TABLE_NAME='t_job'

你可能感兴趣的:(数据库)