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记录,所以大数据量建立索引是非常有必要的. ...
随机推荐
- GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
全球互联网技术在飞速发展的同时,网络安全事件也随之频发.除了直接带来经济损失的网络恶意攻击之外,企业在多个方面也遭受着不同程度的网络恶意攻击,包括品牌形象.管理时间.企业竞争力.客户成交量.用户行为等 ...
- css实现div中图片高度自适应并与父级div宽度一致
需求:1.父级div不设置高度 2.图片高度自适应,并且显示为正方形: 以前遇到列表中图片高度必须和父级宽度相同,并且需要为正方形的时候,最开始的方法是定死图片高度,这样会导致不同分辨率下图片会压缩, ...
- [Usaco 5.4] Telecowmunication
Description 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c), ...
- 走近webpack(2)--css打包及压缩js
前面的文章介绍了webpack的devServer以及多入口多出口文件的配置,咱们继续往下学. 在开始学习接下来的知识之前,我们先回顾一下,前文提到了webpack的简单配置方法,但是只详细说了下入口 ...
- 排序算法Java实现(快速排序)
算法描述:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止. ...
- SQL注入之Sqli-labs系列第二篇
废话不在多说 let's go! 继续挑战第二关(Error Based- String) 同样的前奏,就不截图了 ,and 1=1和and 1=2进行测试,出现报错 还原sql语句 查看源代码 ...
- PHP微信公众平台oauth2.0网页授权登录类的封装demo
一.微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需scope为 ...
- CSS3美化网页元素
<span>标签 </span>属性名 含义 举例font-family 设置字体类型 font-family:"隶书"font-size 设置字体大小 f ...
- L2-001. 紧急救援(PAT)~最短路应用
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求 ...
- JVM学习九:JVM之GC算法和种类
我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收 ...