python/MySQL(索引、执行计划、BDA、分页)
---恢复内容开始---
python/MySQL(索引、执行计划、BDA、分页)
MySQL索引:
所谓索引的就是具有(约束和加速查找的一种方式)
创建索引的缺点是对数据进行(修改、更新、删除)比较慢!
索引共分为:
1、主键索引:
特性:加速查找、不能为空、不能重复
2、普通索引:
特性:加速查找
3、唯一索引:
特性:加速查找、可以为空、不能重复
4、联合索引:
特征:(多列)联合主键索引、联合唯一索引、联合普通索引
5、全文索引:
特征:对文本的内容进行分词,进行搜索
索引用途及案例:
在频繁查找使用的数据进行创建索引
加速查找:
通过设置得索引去查找速度较快;
例如:
mysql> select * from useru where uname='alex23232';
+-------+-----------+---------------+--------+
| id | uname | emlia | gender |
+-------+-----------+---------------+--------+
| 23232 | alex23232 | 23232@.qq.com | 男 |
+-------+-----------+---------------+--------+
1 row in set (0.04 sec)
=========================================== 上边是通过索引查找,速度快! ===========================================
mysql> select * from useru where emlia='23423@.qq.com';
+-------+-----------+---------------+--------+
| id | uname | emlia | gender |
+-------+-----------+---------------+--------+
| 23423 | alex23423 | 23423@.qq.com | 男 |
+-------+-----------+---------------+--------+
1 row in set (0.18 sec)
==========================================
上边的就是没有通过索引进行查找,速度较慢!
无索引:是从前到后依次查找(那样相当于手中拿着一本厚厚的新华字典,如果想要查看数据就要从头一直翻到数据那页) 有索引:是从特殊符索引表里找到相应的位置,然后再找到数据存放在硬盘的位置。
索引类型:
hash索引: 这是一种索引方式,它把数据表中的设置为索引的哪一列转换成hash值开辟一个新的表格进行存储,当要进行索引查询时就去新开辟的表格中查找相应的存储部位。(hash很适合找单独数据,在找范围内的数据比较慢!) btree索引:也称为二叉树索引,在数据库中默认使用 (范围内可以快速查找!)
索引的操作:
创建普通索引:
create index in_de on useru(uname);
create index 索引名 on 需要创建的表名(表列)
创建唯一索引:
create unique index in_ss on useru(uname)
唯一索引比普通的索引要快(因为普通的索引会出现重复)
创建组合索引:(最左前缀匹配)
create index index__s on useru(uname,emali);
组合索引需要遵循最左前缀匹配
例如:
select * from useru where unaem='alex212132'; 这样就是在执行索引查询 (命中)
select * from useru where emali='234322@.qq.com'; 这样的就没有执行索引查询(未命中)
select * from useru where uname='alex2323' and emali='234234242@.11.com'; 这样就是在执行索引查询(命中)
索引合并:
create index in_s on useru(uname);
create index in_c on useru(emali);
分别设置俩个索引,把他们合并进行查找;
select * from useru where uname='alex1212' and emali='9439493@.qq.com';
select * from useru where emali='67453345@.qq.com'
组合索引没有最左前缀的限制
覆盖索引:
select uname from useru where uname='alex232343';
在索引文件中直接获取数据
命中索引:
like
like ‘al%0’
select * from useru where unaem like 'a%0';
未命中索
使用函数
mysql> select * from useru where reverse(uname)='0324xela';
+------+----------+--------------+--------+
| id | uname | emlia | gender |
+------+----------+--------------+--------+
| 4230 | alex4230 | 4230@.qq.com | 男 |
+------+----------+--------------+--------+
1 row in set (12.59 sec) 未命中
or 未命中
mysql> select * from useru where emlia='234234@.qq.com' or uname='alex23432';
+--------+------------+----------------+--------+
| id | uname | emlia | gender |
+--------+------------+----------------+--------+
| 23432 | alex23432 | 23432@.qq.com | 男 |
| 234234 | alex234234 | 234234@.qq.com | 男 |
+--------+------------+----------------+--------+
2 rows in set (0.05 sec) mysql> select * from useru where uname='alex23432';
+-------+-----------+---------------+--------+
| id | uname | emlia | gender |
+-------+-----------+---------------+--------+
| 23432 | alex23432 | 23432@.qq.com | 男 |
+-------+-----------+---------------+--------+
1 row in set (0.00 sec)
未命中,因为查询当中有未创建索引导致加速失败
or 命中
mysql> select * from useru where id='' or uname='alex23432';
+--------+------------+----------------+--------+
| id | uname | emlia | gender |
+--------+------------+----------------+--------+
| 23432 | alex23432 | 23432@.qq.com | 男 |
| 323423 | alex323423 | 323423@.qq.com | 男 |
+--------+------------+----------------+--------+
2 rows in set (0.04 sec)
命中,因为俩个都设置了索引,加速成功
类型不一样
mysql> select * from useru where uname=3432;
Empty set, 65535 warnings (13.03 sec)
!= (不等于)
select * from useru where uname!='alex122';
未命中,因为需要进行匹配 select * from uname where id!=232;
命中,因为主键还是会走索引
>
select * from useru where uname > 'alex232'
未命中,因为设置索引不是整型 select * from useru where id > 3232;
命中,因为id是整型,如果设置的索引是整型就会加速;
order by
select * from useru order by uname desc;
未命中,因为根据排序时候,选择的映射如果不是索引,则不走索引
select * from useru order by id desc;
组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引
其他注意事项:
避免使用select * count(1)或count(列)代替count(*) 创建表时尽量 char 代替 vachar 表的字段顺序固定长度的字段优先 组合索引代替多个单列索引(经常使用多个条件查询时) 尽量使用短索引 使用连接(join)来代替子查询(sub-queries) 连表时注意条件类型需一致 索引散列值(重复少)不适合建索引,例:性别不适合
执行计划:
explain +sql语句 用于显示sql执行信息参数,根据参数信息可以进行sql优化(模拟出运行时间)
mysql> explain select * from useru;
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+
| 1 | SIMPLE | useru | NULL | ALL | NULL | NULL | NULL | NULL | 1835575 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------+
1 row in set, 1 warning (0.00 sec) 主要是查看type类型
select——type (查询类型)
SIMPLE 简单查询 PRIMARY 最外层查询 SUBQUERY 映射为子查询 DERIVED 子查询 UNION 联合 UNION RESULT 使用联合的结果
table 正在访问的表名 type 查询时分的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const ALL 全表扫描,对于数据表从头到尾找一遍 特别的:如果limit限制,则找到之后就不在继续向下扫描 虽然上述俩个语言都会进行全表扫描,第二句使用了limit 则找到一个后就不在继续查找 index 全索引扫描,对索引从头到尾字找一遍 select id from useru; ret 根据索引查找一个或多个值 select * from useru where uname='alex12122l; EQ_REF 连接时使用primary key 或unique类型 select useru.id,useru.uname from useru left join usert on useru.id=usert.nid; const 常量: 表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为只读取一次 system 系统 表仅有一行(=系统表)这是const连接类型的一个特例。 select * from(select id from uname where id =1)as A; possible_keys 可以使用的索引 key 真实使用的 key_len MySQL中使用索引字节长度 rows MYSQL 估计为了找到所需的行儿要读取的行数---------只是预估值 extra 该列包含MySQL解决查询的详细信息 “Using index” 此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。 “Using where” 这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。 “Using temporary” 这意味着mysql在对查询结果排序时会使用一个临时表。 “Using filesort” 这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。 “Range checked for each record(index map: N)” 这个意味着没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的。
慢日志查询:
配置MySQL自动记录慢日志
1 slow _query_log=OFF 是否开启慢日志记录
2 long_query_time=2 时间限制,超过此时间,则记录
3 slow_query_log_file=/usr/low/slow.log 日志文件
4 log_queseris_not_indexds=OFF 为使用索引的搜素是否记录
5
6 注:查看当前配置信息:
7 show variables like ‘%query%’
8 修改当前配置:
9 set global 变量名=值
查看MySQL慢日志
mysqldumpslow -s at -a /usr/local/var/mysql/MacBook-Pro-3-slow.log
1 """
2 --verbose 版本
3 --debug 调试
4 --help 帮助
5
6 -v 版本
7 -d 调试模式
8 -s ORDER 排序方式
9 what to sort by (al, at, ar, c, l, r, t), 'at' is default
10 al: average lock time
11 ar: average rows sent
12 at: average query time
13 c: count
14 l: lock time
15 r: rows sent
16 t: query time
17 -r 反转顺序,默认文件倒序拍。reverse the sort order (largest last instead of first)
18 -t NUM 显示前N条just show the top n queries
19 -a 不要将SQL中数字转换成N,字符串转换成S。don't abstract all numbers to N and strings to 'S'
20 -n NUM abstract numbers with at least n digits within names
21 -g PATTERN 正则匹配;grep: only consider stmts that include this string
22 -h HOSTNAME mysql机器名或者IP;hostname of db server for *-slow.log filename (can be wildcard),
23 default is '*', i.e. match all
24 -i NAME name of server instance (if using mysql.server startup script)
25 -l 总时间中不减去锁定时间;don't subtract lock time from total time
26 """
limit 分页:
无论是否有索引,limit分页是一个值得关注的问题:
mysql> select * from useru limit 10,10;
+----+--------+------------+--------+
| id | uname | emlia | gender |
+----+--------+------------+--------+
| 11 | alex11 | 11@.qq.com | 男 |
| 12 | alex12 | 12@.qq.com | 男 |
| 13 | alex13 | 13@.qq.com | 男 |
| 14 | alex14 | 14@.qq.com | 男 |
| 15 | alex15 | 15@.qq.com | 男 |
| 16 | alex16 | 16@.qq.com | 男 |
| 17 | alex17 | 17@.qq.com | 男 |
| 18 | alex18 | 18@.qq.com | 男 |
| 19 | alex19 | 19@.qq.com | 男 |
| 20 | alex20 | 20@.qq.com | 男 |
+----+--------+------------+--------+
10 rows in set (0.00 sec)
这样如果数据多,查看的页数越多就相当于扫描全部文件在限制的位置停止,这样查询还不是走到索引、
又要实现分页功能还要走索引查询:
mysql> select
-> *
-> from
-> useru
-> where
-> id < (select id from (select id from useru where id < 970 order by id desc limit 40)as A order by A.id asc limit 1)
-> order by
-> id desc
-> limit 10;
+-----+---------+-------------+--------+
| id | uname | emlia | gender |
+-----+---------+-------------+--------+
| 929 | alex929 | 929@.qq.com | 男 |
| 928 | alex928 | 928@.qq.com | 男 |
| 927 | alex927 | 927@.qq.com | 男 |
| 926 | alex926 | 926@.qq.com | 男 |
| 925 | alex925 | 925@.qq.com | 男 |
| 924 | alex924 | 924@.qq.com | 男 |
| 923 | alex923 | 923@.qq.com | 男 |
| 922 | alex922 | 922@.qq.com | 男 |
| 921 | alex921 | 921@.qq.com | 男 |
| 920 | alex920 | 920@.qq.com | 男 |
+-----+---------+-------------+--------+
10 rows in set (0.00 sec)
python/MySQL(索引、执行计划、BDA、分页)的更多相关文章
- Mysql查看执行计划-explain
最近生产环境有一些查询较慢,需要优化,于是先进行业务确认查询条件是否可以优化,不行再进行sql优化,于是学习了下Mysql查看执行计划. 语法 explain <sql语句> 例如: e ...
- Mysql查看执行计划
EXPLAIN(小写explain)显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN + sql语句可以查看mysql的执行 ...
- MySQL数据库执行计划(简单版)
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库执行计划简单版时间:2019年2月25日内容:MySQL数据库执行计划简单版重点:MySQL ...
- Mysql explain执行计划
EXPLAIN(小写explain)显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN + sql语句可以查看mysql的执行 ...
- 网站优化—mysql explain执行计划
explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的 ...
- MySQL性能分析, mysql explain执行计划详解
MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...
- 15、简述MySQL的执行计划?
具体的Mysql的执行计划,请参考下面的链接: MySQL_执行计划详细说明
- python全栈开发day58-mysql存储过程,权限,索引,慢日志,执行计划,分页优化处理
1.存储过程 delimiter // create procedure insert_data(in rows int) begin DECLARE n INT DEFAULT 1; drop ta ...
- 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...
- 【MySQL】MySQL的执行计划及索引优化
我们知道一般图书馆都会建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的. ...
随机推荐
- vue的图片上传
转载 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- struts2和spring mvc的区别
在项目中使用struts2和spring mvc为了实现后台的业务代码和前台数据之间的传递,现在基本上不会有用struts2的了,几次面试问的最多的关于struts2的问题就是struts2和spri ...
- gif文件解析
详细资料:http://blog.csdn.net/wzy198852/article/details/17266507 MD5:98206F88B84CCC399C840C8EEC902CCF GI ...
- Maven-08: 插件的配置
完成了插件和生命周期的绑定之后,用户还可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求.几乎所有Maven插件的目标都有一些可配置的参数.用户可以通过命令行和POM配置等方式来 ...
- 笔记:MyBatis XML配置详解
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息.文档的顶层结构如下: configuration 配置 properties ...
- 笔记:Maven 仓库和插件配置本机私服
通过配置POM中的配置仓库和插件仓库,只在当前项目生效,而实际应用中,我们希望通过一次配置就能让本机所有的Maven项目都使用自己的Maven私服,这个时候我们需要配置 settings.xml文件, ...
- delete与delete[]的区别
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...
- C++单例模式的经典实现(Singleton)
C++单例经典实现 本文主要介绍C++使用中的单例的两种经典实现,基本可满足一般的使用,主要分为饿汉模式和懒汉模式两种 饿汉模式 class Singleton { public: static Si ...
- oracle session数激增排查过程
我们的生产系统使用的是oracle 11G RAC,昨天突然收到微信告警通知session数达到450个,平时的session数在200个左右. select username,status,mach ...
- 大数据 --> ProtoBuf的使用和原理
ProtoBuf的使用和原理 一.简介 Protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.Protobuf是跨语言的,并且自带了 ...