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 编写.非最优的 ...
随机推荐
- C++ new和malloc的区别
1.new关键字是C++中的一部分,malloc是由C库提供的函数: 2.new是以具体类型为单位进行内存分配,malloc只能以字节为单位进行内存分配: 3.new在申请单个类型变量时可进行初始化, ...
- supervisor配置kibana
在/etc/supervisor/conf.d/目录下添加kibana.conf [program:kibana]command=/opt/kibana-6.8.1-linux-x86_64/bin/ ...
- Maven 梳理-自动创建Maven项目(非web)
mvn archetype:create和mvn archetype:generate create is deprecated in maven 3.0.5 and beyond,在maven3.0 ...
- 读《深入理解Elasticsearch》点滴-查询评分
计算文档得分的因子: 文档权重(document boost):索引期赋予某个文档的权重值 字段权重(field boost):查询期赋予某个文档的权重值 协调因子(coord):基于文档中词项个数的 ...
- 【SQL server基础】判断数据库、表格、视图、存储过程、函数书否存在
库是否存在 if exists(select * from master..sysdatabases where name=N'库名') print 'exists' else print 'not ...
- 【ADO.NET基础】加密方法公共类
各种加密方法集锦: using System; using System.Security.Cryptography; using System.Text; using System.IO; usin ...
- Spark 学习笔记之 Streaming和Kafka Direct
Streaming和Kafka Direct: Spark version: 2.2.0 Scala version: 2.11 Kafka version: 0.11.0.0 Note: 最新版本感 ...
- html、css以及javascript的注释方式
HTML:<!--注释内容 -->; CSS:/* 注释内容*/ JS: //注 释内容; 或者块/* 注释内容 */, sublime中注释方法:选中注释内容+ctrl+/ , ...
- ubuntu14.04 安装tensorflow始末
基于ubuntu14.04 干净的系统一步步遇到的坑记录下来: 怀着平静学习的心情,问题总的能解决的! 1. 首先看了下当前python版本 python --version Python 2.7.6 ...
- SQL SERVER数据库多条件查询
例如:查询挂号超500的数据select CONVERT(VARCHAR(10),DGH,23),COUNT(*) from yxhis2017..VTBMZGHMX2017 where bth=0 ...