Mysql数据库(十)MySQL性能优化
一、优化概述
为了提高MySQL数据库的性能,不要进行一系列的优化措施。如果MySQL数据库需要进行大量的查询操作,那么就需要对查询语句进行优化。对于耗费时间的查询语句进行优化,可以提高整体地查询速度。如果连接MySQL数据库的用户很多,那么就需要对MySQL服务器进行优化,否则,大量的用户同时连接MySQL数据库,可能会造成数据库系统崩溃。
1.分析MySQL数据库的性能
mysql> show status like 'Connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections | 13 |
+---------------+-------+
1 row in set (0.81 sec)
还可以查询的几个参数:Uptime(上线时间)、Slow_queries(慢查询)、Com_select(查询操作)、Com_insert(插入操作)、Com_delete(删除操作)。
2.通过profile工具分析语句消耗性能
(1)首先查看profile工具是否开启
mysql> show variables like '%pro%';
+------------------------------------------+-------+
| Variable_name | Value |
+------------------------------------------+-------+
| check_proxy_users | OFF |
| have_profiling | YES |
| mysql_native_password_proxy_users | OFF |
| performance_schema_max_program_instances | -1 |
| profiling | OFF |
| profiling_history_size | 15 |
| protocol_version | 10 |
| proxy_user | |
| sha256_password_proxy_users | OFF |
| slave_compressed_protocol | OFF |
| stored_program_cache | 256 |
+------------------------------------------+-------+
11 rows in set, 1 warning (0.00 sec)
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
(2)然后使用profile工具
mysql> use db_library;
Database changed
mysql> select * from tb_bookinfo;
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
| 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
| 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
| 17120110 | ShenOba | 4 | ShenJiang | 118 | 52.15 | 300 | 4 | 2018-04-20 | 0 | 4 |
+----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
3 rows in set (0.01 sec) mysql> show profiles;
+----------+------------+---------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------+
| 1 | 0.00019475 | SELECT DATABASE() |
| 2 | 0.01017075 | select * from tb_bookinfo |
+----------+------------+---------------------------+
2 rows in set, 1 warning (0.00 sec)
二、优化查询
1.分析查询语句
(1)使用EXPLAIN SELECT语句
mysql> EXPLAIN SELECT * FROM tb_bookinfo;
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | tb_bookinfo | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
(2)使用DESCRIBE SELECT语句
mysql> DESCRIBE SELECT * FROM tb_bookinfo;
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | tb_bookinfo | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
2.索引对查询速度的影响
(1)首先分析未使用索引时的查询情况(从rows字段下的3可以看出,数据库存在的3条数据都被查询了一遍)
mysql> DESCRIBE SELECT * FROM tb_bookinfo WHERE author='ShenJiang';
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | tb_bookinfo | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
(2)使用索引后的查询情况(只查询了1行数据)
mysql> CREATE INDEX index_name ON tb_bookinfo(author);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> DESCRIBE SELECT * FROM tb_bookinfo WHERE author='ShenJiang';
+----+-------------+-------------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | tb_bookinfo | NULL | ref | index_name | index_name | 33 | const | 1 | 100.00 | NULL |
+----+-------------+-------------+------------+------+---------------+------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
3.使用索引查询
(1)应用LIKE关键字优化索引查询(%放在第一个字符,索引不会被使用)
mysql> DESCRIBE SELECT * FROM tb_bookinfo WHERE author LIKE '%enJiang';
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | tb_bookinfo | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 33.33 | Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec) mysql> DESCRIBE SELECT * FROM tb_bookinfo WHERE author LIKE 'She%';
+----+-------------+-------------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | tb_bookinfo | NULL | range | index_name | index_name | 33 | NULL | 1 | 100.00 | Using index condition |
+----+-------------+-------------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)
(2)查询语句中使用多列索引(多列索引是指在表的多个字段上创建一个索引。只有查询条件中使用了这些字段中的第一个字段时,索引才会被正常使用)
mysql> CREATE INDEX index_book_info ON tb_bookinfo(bookname,price);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
必须使用第一字段bookname时,索引才可以被正常使用。
(3)查询语句中使用OR关键字
mysql> DESCRIBE SELECT * FROM tb_bookinfo WHERE author='ShenJiang' OR price=51.10;
+----+-------------+-------------+------------+------+------------------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+------------------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | tb_bookinfo | NULL | ALL | index_name,index_price | NULL | NULL | NULL | 3 | 55.56 | Using where |
+----+-------------+-------------+------------+------+------------------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)
三、优化数据库结构
1.将字段很多的表分解成多个表(将字段特别多且有些字段的使用频率很低的表,分解成多个表。在查询时可以联表查询)
SELECT * FROM tb_student,tb_student_extra WHERE tb_student.id=tb_student_extra.id
2.增加中间表
mysql> desc tb_bookinfo;
+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| barcode | varchar(30) | YES | | NULL | |
| bookname | varchar(70) | YES | MUL | NULL | |
| typeid | int(10) unsigned | YES | | NULL | |
| author | varchar(30) | YES | MUL | NULL | |
| ISBN | varchar(20) | YES | | NULL | |
| price | float(8,2) | YES | MUL | NULL | |
| page | int(10) unsigned | YES | | NULL | |
| bookcase | int(10) unsigned | YES | | NULL | |
| inTime | date | YES | | NULL | |
| del | tinyint(1) | YES | | 0 | |
| id | int(11) | NO | PRI | NULL | |
+----------+------------------+------+-----+---------+-------+
11 rows in set (0.00 sec) mysql> desc tb_borrow;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| readerid | int(10) unsigned | YES | | NULL | |
| bookid | int(10) | YES | | NULL | |
| borrowTime | date | YES | | NULL | |
| backTime | date | YES | | NULL | |
| operator | varchar(30) | YES | | NULL | |
| ifback | tinyint(1) | YES | | 0 | |
+------------+------------------+------+-----+---------+----------------+
7 rows in set (0.01 sec) mysql> CREATE TABLE temp_bookinfo(id INT NOT NULL,
-> name varchar(45) NOT NULL,
-> borrowTime date);
Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO temp_bookinfo SELECT a.id,a.bookname,b.borrowTime
-> FROM tb_bookinfo a,tb_borrow b WHERE a.typeid=b.id;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from temp_bookinfo;
+----+-----------+------------+
| id | name | borrowTime |
+----+-----------+------------+
| 2 | Lian | 2018-04-19 |
| 3 | Tian King | 2018-04-16 |
+----+-----------+------------+
2 rows in set (0.00 sec)
3.优化插入记录的速度
插入记录时,索引、唯一性校验都会影响到插入记录的速度。而且,一次插入多条记录和多次插入记录所耗费的时间是不一样的。
(1)禁用索引
ALTER TABLE tablename DISABLE KEYS; ALTER TABLE tablename ENABLE KEYS;
(2)禁用唯一性检查
SET UNIQUE_CHECK=0; SET UNIQUE_CHECK=1;
(3)优化INSERT语句
一个INSERT语句插入多条记录比一个INSERT语句只插入一个记录,多个INSERT语句插入多条记录减少了与数据库之间的连接等操作,其速度比第二种方式要快。
4.分析表、检查表和优化表
(1)分析表(表名称、执行的操作、信息类型(状态、警告、错误或信息中的一个)、显示信息)
mysql> ANALYZE TABLE tb_bookinfo;
+------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------+---------+----------+----------+
| db_library.tb_bookinfo | analyze | status | OK |
+------------------------+---------+----------+----------+
1 row in set (0.01 sec)
(2)检查表(检查表是否存在错误)
mysql> CHECK TABLE tb_bookinfo;
+------------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------+-------+----------+----------+
| db_library.tb_bookinfo | check | status | OK |
+------------------------+-------+----------+----------+
1 row in set (0.00 sec)
(3)优化表(只能优化表中的varchar、blog或text类型的字段。可以消除删除和更新造成的磁盘碎片)
mysql> OPTIMIZE TABLE tb_bookinfo;
+------------------------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+------------------------+----------+----------+-------------------------------------------------------------------+
| db_library.tb_bookinfo | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| db_library.tb_bookinfo | optimize | status | OK |
+------------------------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.08 sec)
四、优化多表查询(子查询的查询时间比连接查询的时间要少很多)
SELECT s.name FROM tb_student2 s,tb_classes c WHERE s.classid=c,id AND c.name='一年三班'; SELECT name FROM tb_student2 WHERE classid=(SELECT id FROM tb_classes WHERE name='一年三班');
五、优化表设计
(1)在设计数据表是应优先考虑使用特定字段长度,后考虑使用变长字段。同时将字段长度设置成其可能应用的最大范围可以充分地优化查询效率
(2)使用OPTIMIZE TABLE命令处理用户经常操作的表,用来减少磁盘碎片的增加。
(3)检查用户已经建立的数据表,确认这些表是否有可能整合成一个表,如果没有必要整合,可以使用连接查询。
Mysql数据库(十)MySQL性能优化的更多相关文章
- MySQL数据库在IO性能优化方面的设置选择(硬件)
提起MySQL数据库在硬件方面的优化无非是CPU.内存和IO.下面我们着重梳理一下关于磁盘I/O方面的优化. 1.磁盘冗余阵列RAID RAID(Redundant Array of Inexpens ...
- mysql数据库架构设计与优化
mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179 收藏 更多 分类专栏: MySQL 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- MySQL数据库基础知识及优化
MySQL数据库基础知识及优化必会的知识点,你掌握了多少? 推荐阅读: 这些必会的计算机网络知识点你都掌握了吗 关于数据库事务和锁的必会知识点,你掌握了多少? 关于数据库索引,必须掌握的知识点 目录 ...
- Mysql数据库写入数据速度优化
Mysql数据库写入数据速度优化 1)innodb_flush_log_at_trx_commit 默认值为1:设置为0,可以提高写入速度. 值为0:提升写入速度,但是安全方面较差,mysql服务器 ...
- Mysql数据库知识-Mysql索引总结 mysql mysql数据库 mysql函数
mysql数据库知识-Mysql索引总结: 索引(Index)是帮助MySQL高效获取数据的数据结构. 下边是自己整理的资料与自己的学习总结,,做一个汇总. 一.真的有必要使用索引吗? 不是每一个性能 ...
- 【MySQL 数据库】MySQL目录
目录 [第一章]MySQL数据概述 [第二章]MySQL数据库基于Centos7.3-部署 [MySQL解惑笔记]Centos7下卸载彻底MySQL数据库 [MySQL解惑笔记]忘记MySQL数据库密 ...
- mysql数据库开发常见问题及优化
mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...
- mysql笔记03 查询性能优化
查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...
- MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询
本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...
- MySQL优化技巧之四:mysql数据库开发常见问题及优化[转]
mysql 数据库是被广泛应用的关系型数据库,其体积小.支持多处理器.开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高.在使用 mysql 的过程中不规范的 SQL 编写.非最优的 ...
随机推荐
- Windows上部署MySql
下载安装包 最新版本可以在 MySQL 下载中下载. 下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 D:\Program Files\Java\mysql-8.0.16-w ...
- [Python]字典的简单用法
Python中的字典与现实中字典类似,从字典中可以找到“鱼”字:鱼类是体被骨鳞.以鳃呼吸.通过尾部和躯干部的摆动以及鳍的协调作用游泳和凭上下颌摄食的变温水生脊椎动物.类比到Python的字典中,把“鱼 ...
- ppt课件动手动脑实际验证
1关于double精度 源代码:public class Doublejingdu { public static void main(String[] args) { System.out.prin ...
- Ubuntu 查看操作系统的位数
查看Ubuntu操作系统的位数是32位还是64位,可以通过以下命令来查看: getconf LONG_BIT 返回32或64 :如图
- 学 Java 网络爬虫,需要哪些基础知识?
说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...
- Python基础(十八)
今日主要内容 包 一.包 (一)什么是包 只要是含有__init__.py文件的文件夹就是一个包 包的本质其实就是一个文件夹,利用包将不同功能的模块组织起来,以此来提高程序的结构性和可维护性 包是用来 ...
- python 虚拟环境配置
刚学习 python 的同学经常会遇到一个问题: 已经安装了特定的包或者第三库,但是 pycharm 总是提示没有找到.
- 【maven的使用】1maven的概念与配置
maven是一个基于java平台的自动化构建工具.构建工具的发展由make->ant->maven->gradle其中gradle还在发展中,使用较少,学习难度比较大,所以目前占据主 ...
- 【Java】web实现图片在线预览
一.场景还原 用户上传了一张图片,已有服务器保存路径,现由于系统配置无法直接通过图片URL打开预览图片,需实现点击预览将图片显示在浏览器上. 二.实现方法 html: <a href=" ...
- 使用LitePal建立表关联
关联关系的基础知识 喜欢把所有的代码都写在一个类里的程序员肯定是个新手.没错,任何一个像样的程序都不可能仅仅只有一个类的,同样地,任何一个像样的数据库也不可能仅仅只有一张表.我们都知道,在面向对象 ...