0

0

分享Mysql优化思路

藏色散人

藏色散人

发布时间:2020-04-23 13:37:20

|

2010人浏览过

|

来源于cnblogs

转载

一、总体优化思路

首先构建脚本观察查询数,连接数等数据,确定环境原因以及内部SQL执行原因,然后根据具体原因做具体处理。

推荐:《mysql视频教程

二、构建脚本观察状态

mysqladmin -uroot -p  ext \G

 

该命令可获取当前查询数量等信息,定时轮询并将结果重定向到文本中,然后处理成图表。

三、处理对策

1.若是规律性出现查询慢,考虑缓存雪崩问题。

对于该问题只需将缓存的失效时间处理成不要相近时间同时失效,失效时间尽量离散化,或者集中到午夜失效。

2.若非规律性查询缓慢,考虑设计缺乏优化

处理方法:

a:开启profiling记录查询操作,并获取语句执行详细信息

show variables like '%profiling%';
set profiling=on;
select count(*) from user; 
show profiles;
show profile for query 1;
>>>
+--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000060 |
| Executing hook on transaction  | 0.000004 |
| starting                       | 0.000049 |
| checking permissions           | 0.000007 |
| Opening tables                 | 0.000192 |
| init                           | 0.000006 |
| System lock                    | 0.000009 |
| optimizing                     | 0.000005 |
| statistics                     | 0.000014 |
| preparing                      | 0.000017 |
| executing                      | 0.001111 |
| end                            | 0.000006 |
| query end                      | 0.000003 |
| waiting for handler commit     | 0.000015 |
| closing tables                 | 0.000011 |
| freeing items                  | 0.000085 |
| cleaning up                    | 0.000008 |
+--------------------------------+----------+

 

b:使用explain 查看语句执行情况,索引使用,扫描范围等等

mysql> explain select count(*) from goods \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: goods
   partitions: NULL
         type: index   
possible_keys: NULL
          key: gid
      key_len: 5
          ref: NULL
         rows: 3
     filtered: 100.00
        Extra: Using index

 

c:相关优化手法

表的优化与列类型选择

列选择原则:

1:字段类型优先级 整型 > date,time > char,varchar > blob

原因:整型,time运算快,节省空间

char/varchar要考虑字符集的转换与排序时的校对集,速度慢

blob无法使用内存临时表

2:够用就行,不要慷慨(如 smallint,varchar(N))

原因:大的字段浪费内存,影响速度

以varchar(10), varchar(300)存储的内容相同,但在表联查时,varchar(300)要花更多内存

3:尽量避免使用NULL

原因:NULL不利于索引,要用特殊的字节来标注.

在磁盘上占据的空间其实更大

索引优化策略

1.索引类型

1.1 B-tree索引(排好序的快速查找结构)

注:Myisam,innodb中,默认用的是B-tree索引

淘宝28街整站源码
淘宝28街整站源码

对淘宝28街源码作了较大优化,简化了程序目录,关键字也做了优化,比淘宝里卖的强多了。最近换站了用不到,故分享出来,大家用批量修改的软件改下PID和网址就可以用了。

下载

1.2 hash索引

在memory表里,默认是hash索引,hash的理论查询时间复查度为O(1)

疑问:既然hash索引如此高效,为何不都用他?

a.hash函数计算后的结果是随机的,如果是在磁盘上放置数据,以主键为id为例,那么随着id的增长,id对应的行,在磁盘上随机放置。

b.无法对范围查询进行优化

c.无法利用前缀索引,比如在b-tree中,field列的值为“helloworld”,索引查询xx=hello/xx=helloworld都可以利用索引(左前缀索引),但hash索引无法做到,因为hash(hello)与hash(helloworld)并无关联关系。

d.排序也无法优化

e.必须回行,通过索引拿到数据位置,必须回到表中取数据.

2.b-tree索引的常见误区

2.1 在where条件常用的列上都加上索引

例:where cat_id=3 and price>100; //查询第3个栏目,100元以上的商品

误:cat_id和price上都加上索引。其实只能用上一个索引,他们都是独立索引.

2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用

2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用

正解:多列索引上,索引发挥作用,需要满足左前缀要求(层层索引)

以index(a,b,c)为例:

语句 索引是否发挥作用
where a=3 是
where a=3 and b=5 是
where a=3 and b=5 and c=4 是
where b=3 or where c=4 否
where a=3 and c=4 a列能发挥索引作用,c列不能
where a=3 and b>10 and c=7 a,b能发挥索引作用,c列不能

高性能索引策略

1.对于innodb而言,因为节点下有数据文件,因此节点的分裂将会变得比较慢,对于innodb的主键,尽量用整型,而且是递增的整型。

2.索引的长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多)。

3.针对列中的值,从左往右截取部分来建索引。

a.截的越短,重复度越高,区分越小,索引效果越不好

b.截的越长,虽然区分度提高,但索引文件变大影响速度

所以尽量在长度上找到一个平衡点使性能最大化,惯用手法:截取不同长度来测试索引区分度

区分度测试: 

select count(distinct left(word, 1)) / count(*) from table;

测试完成后可以按测试得出的最优长度建立索引 

alter table table_name add index word(word(4));

理想的索引

1.查询频繁

2.区分度高

3.长度小

4.尽量覆盖常用查询字段

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

727

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1242

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

820

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号