---恢复内容开始---

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、分页)的更多相关文章

  1. Mysql查看执行计划-explain

    最近生产环境有一些查询较慢,需要优化,于是先进行业务确认查询条件是否可以优化,不行再进行sql优化,于是学习了下Mysql查看执行计划. 语法 explain <sql语句>  例如: e ...

  2. Mysql查看执行计划

    EXPLAIN(小写explain)显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN + sql语句可以查看mysql的执行 ...

  3. MySQL数据库执行计划(简单版)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库执行计划简单版时间:2019年2月25日内容:MySQL数据库执行计划简单版重点:MySQL ...

  4. Mysql explain执行计划

    EXPLAIN(小写explain)显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. EXPLAIN + sql语句可以查看mysql的执行 ...

  5. 网站优化—mysql explain执行计划

    explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的 ...

  6. MySQL性能分析, mysql explain执行计划详解

    MySQL性能分析 MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析 ...

  7. 15、简述MySQL的执行计划?

    具体的Mysql的执行计划,请参考下面的链接: MySQL_执行计划详细说明

  8. python全栈开发day58-mysql存储过程,权限,索引,慢日志,执行计划,分页优化处理

    1.存储过程 delimiter // create procedure insert_data(in rows int) begin DECLARE n INT DEFAULT 1; drop ta ...

  9. 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...

  10. 【MySQL】MySQL的执行计划及索引优化

    我们知道一般图书馆都会建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的. ...

随机推荐

  1. 格式化JSON数据

    function formatJson(json, options) { var reg = null, formatted = '', pad = 0, PADDING = ' '; options ...

  2. maven项目与普通项目的区别

    maven项目 1:创建方式不同 (web项目举例) 第一种: 第二种: 2:目录结构  稍有不同 3:Pom文件 添加依赖信息,需要那个jar包的时候  加入哪个jar包的依赖,要不然无法使用这个j ...

  3. MyEclipse安装Eclipse Memory Analyzer插件以及使用例子

    一 :安装 1.Memory Analyzer 插件下载地址:http://www.eclipse.org/mat/downloads.php 2.将下载的文件解压到MyEclipse的  dropi ...

  4. 多线程使用Lock实现生产者实现者代码

    package cn.com.servyou.qysdsjx.thread; import java.util.ArrayList; import java.util.List; import jav ...

  5. 掌握这些回答技术面试题的诀窍,让你offer拿到手软。

    三.四月份,春回大地,万物复苏(请自带赵忠祥老师的BGM),又到了不少同学的跳槽时节. 最近一段时间团队也在招人,这期间筛选了不少简历,面试了一些候选人.这里谈谈我自己的对「怎样回答面试题」的理解. ...

  6. Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  7. Maven+SSM框架搭建【spring+springmvc+mybatis】

    本案例用到:ssm[spring+springmvc+mybatis]框架 数据库:mysql (推荐使用mysql 或者 sqlserver  .oracle太大,一般大型项目才会用到) 开发工具: ...

  8. 进程与fork()、wait()、exec函数组

    进程与fork().wait().exec函数组 内容简介:本文将引入进程的基本概念:着重学习exec函数组.fork().wait()的用法:最后,我们将基于以上知识编写Linux shell作为练 ...

  9. 201621123040《Java程序设计》第七周学习总结

    1.本周学习总结 1.1思维导图:Java图形界面总结 2.书面作业 2.1GUI中的事件处理 2.1.1写出事件处理模型中最重要的几个关键词. 关键词:事件 事件源 事件监听器 2.1.2任意编写事 ...

  10. 201621123025《Java程序设计》第二周学习总结

    1.本周学习总结 以几个关键词描述本周的学习内容.并将关键词之间的联系描述或绘制出来. 答:java的两种数据类型:基本数据类型和引用数据类型:==与equals的区别:动态数组. 2.书面作业 1. ...