mysql索引优化续
(1)索引类型:
Btree索引:抽象的可以理解为“排好序的”快速查找结构
myisam,innodb中默认使用Btree索引hash索引:hash索引计算速度非常的快,但数据是随机放置的,无法对范围进行优化,无法利用前缀索引,排序也无法优化
memory表里默认使用hash索引
(二)单列索引与多列索引
一、单列索引
二、多列索引
怎么才能够让多列索引充分发挥作用?
1.在多列索引上,索引使用匹配需要符合左前缀规则
有如下联合索引:index(a,b,c)
select * from test_table where a=1 and b=2 and c=3; 从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引
select * from test_table where a=1 and c=3 and b=3; mysql很聪明的,虽然查询的条件列不是按照顺序来的,但是mysql会自动识别的所以仍然都可以使用到索引
select * from test_table where a=1 and b=2 and c>3; 从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引
select * from test_table where a=1 and b>2 and c=3; 从左到右都使用到了索引,虽然有大于号,但是也会使用半块索引,依然c列索引也会使用到,所以都使用到了索引
select * from test_table b=2 and c=3; 索引生效是从左到右的如果断掉了后面的索引列就不会生效了,这个没有用到a索引,所以 一个索引都没有使用到
select * from test_table b=2; 同上
select * from test_table c=3; 同上
分组统计建议要先按照分组的字段进行排序然后再统计
我们想知道某条sql语句是不是按照我们希望的方式使用了索引我们可以使用explain来查看sql语句的执行计划:
explain用法说明:
只需要在sql语句前面加上explain即可
mysql> explain select * from t where c1='a' and c5='e' order by c2,c3;
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| 1 | SIMPLE | t | ref | c1 | c1 | 3 | const | 6 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
table:表示使用的数据表
type:连接类型有多个值,不同的值体现了sql语句不同的优化级别
keys:mysql使用的索引
key_len:mysql使用的索引长度
rows:mysql执行查询的行数,数值越大越不好说明没有用好索引
extra:mysql解决查询的详细详细有几个参数需要解释下
using filesort:说明使用执行该sql语句先使用了数据排序
using index:说明使用了索引
using temporary:说明mysql创建了临时表来容纳结果
(三)show profiles的使用
一般情况情况是这样的我们考虑需要建立给表建立索引是由于查询缓慢,这个时候我们可以通过开启show profiles来了解我们优化的进展,和方案的可行性。
show profiles:默认一般都是关闭的,但是会话级别可以开启这个功能,开启后可以让mysql收集在执行sql语句时的所有相关信息,通过这个可以比较明确的了解优化的成果。
1.查看show profile是否开启
mysql> show variables like "%pro%";
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| have_profiling | YES |
| profiling | OFF |
| profiling_history_size | 15 |
| protocol_version | 10 |
| proxy_user | |
| slave_compressed_protocol | OFF |
| stored_program_cache | 256 |
+---------------------------+-------+
2.如果profiling关闭了则开启选项
mysql> set profiling=1;
3.查看sql语句运行的信息
在开启profile后系统中执行的sql语句都将被记录
mysql> show profiles;
+----------+-------------+--------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+-------------+--------------------------------------------------------------------------------------------------------+
| 1 | 0.00031950 | show variables like "%pro%" |
| 2 | 0.00020125 | show tables |
| 3 | 0.40749175 | select count(*) from b2b_my_test_value |
| 4 | 0.00008600 | show processlist |
| 5 | 0.40956300 | select count(*) from b2b_my_test_value |
| 6 | 0.00007225 | show profile for query |
| 7 | 0.00004150 | show profile for query |
| 8 | 23.30362350 | select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` |
| 9 | 0.00018900 | show index from b2b_my_test_value |
| 10 | 0.00015050 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` |
| 11 | 0.00014875 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` |
| 12 | 0.00016725 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` order by `my_aihao` |
| 13 | 0.00018725 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value group by `my_aihao` |
| 14 | 0.00020875 | show index from b2b_my_test_value |
| 15 | 0.00008125 | explain select avg(`my_age`),`my_aihao` from b2b_my_test_value where group by `my_aihao` |
+----------+-------------+--------------------------------------------------------------------------------------------------------+
15 rows in set, 1 warning (0.00 sec)
这样我们就可以很方便的了解sql执行的时间了
mysql索引优化续的更多相关文章
- mysql索引优化
mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 知识点:Mysql 索引优化实战(3)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...
- MySQL索引优化步骤总结
在项目使用mysql过程中,随着系统的运行,发现一些慢查询,在这里总结一下mysql索引优化步骤 1.开发过程优化 开发过程中对业务表中查询sql分析sql执行计划(尤其是业务流水表),主要是查看sq ...
- MySQL索引优化看这篇文章就够了!
阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...
- mysql索引优化比普通查询速度快多少
mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 【ZZ】MySQL 索引优化全攻略 | 菜鸟教程
MySQL 索引优化全攻略 http://www.runoob.com/w3cnote/mysql-index.html
- mysql数据库优化课程---17、mysql索引优化
mysql数据库优化课程---17.mysql索引优化 一.总结 一句话总结:一些字段可能会使索引失效,比如like,or等 1.check表监测的使用场景是什么? 视图 视图建立在两个表上, 删除了 ...
随机推荐
- ubuntu/centos/mac/windows 使用阿里源加速docker镜像下载
官方下载docker比较慢,阿里提供云容器hub, 1.打开阿里容器hub https://dev.aliyun.com/search.html 该页面右上方有一个管理中心,点击进去 2.选择镜像加速 ...
- OpenCV_火焰检测——完整代码
转:http://blog.csdn.net/xiao_lxl/article/details/43307993 火焰检测小程序 前几天,偶然看到了An Early Fire-Detection Me ...
- TCGA系列--GDCRNATools
https://github.com/Jialab-UCR/GDCRNATools GDCRNATools - An R package for downloading, organizing, an ...
- UOJ #122 【NOI2013】 树的计数
题目链接:树的计数 这道题好神啊……正好有人讲了这道题,那么我就写掉吧…… 首先,为了方便考虑,我们可以把节点重标号,使得\(bfs\)序变成\(1,2,3,\dots,n\),那么显然树的深度就是\ ...
- BZOJ 2594 【WC2006】 水管局长数据加强版
题目链接:水管局长数据加强版 好久没写博客了…… 上次考试的时候写了一发LCT,但是写挂了……突然意识到我已经很久没有写过LCT了,于是今天找了道题来练练手. 首先,LCT这里不讲.这道题要求支持动态 ...
- Python网络编程(Sockets)
一个简单的服务器 #!/usr/bin/python3 # This is server.py file import socket # create a socket object serverso ...
- express 调优的一个过程和心得,不错的文章
Netflix的软件工程师Yunong Xiao最近在公司的技术博客上写了一篇文章,分析了他所在的团队在将Netflix网站UI转移到Node.js上时遇到的延迟问题.在文章中他描述了找到问题根本原因 ...
- poj3281网络流之最大流
加一个源点和汇点,把每头牛拆成两个点,不拆点的话可能会出现多对食物与饮料被一个牛享用的情况,拆点后流量为1,不能同时通过了 然后用最大流处理,每个链接边都是1 #include<map> ...
- UVA-4288 Cat vs. Dog (最大独立集)
题目大意:猫狗大赛,s个猫和t个狗,有v个投票者,他们不是爱猫者就是爱狗者,所以爱猫者一定会对某条猫投晋级票,对某条狗投淘汰票,爱狗者亦然.现在已知这v个人的投票情况,应该使哪些畜牲晋级或淘汰才能使投 ...
- MySQL中视图和普通表的区别
1.视图是数据库数据的特定子集.可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响. 2.视图是抽象的,他在使用时,从表里提取出数据, ...