2019-04-26-day041-数据库的索引
内容回顾
- 多表查询
- 联表查
- 内连接 左右两表中能连上的行才被保留
- 表1 inner join 表2 on 表1.字段1=表2.字段2
- 外连接
- 左外连接 表1中所有的项都会被保留,而表2中只有匹配上表1的项才会被保留
- 表1 left join 表2 on 表1.字段1=表2.字段2
- 右外连接 刚好和左外连接相反right join
- 左外连接 表1中所有的项都会被保留,而表2中只有匹配上表1的项才会被保留
- 内连接 左右两表中能连上的行才被保留
- 子查询
- select 字段 from 表 where 字段 = (select 子句)
- select 字段 from 表 where 字段 > (select 子句)
- select 字段 from 表 where 字段 < (select 子句)
- select 字段 from 表 where 字段 in (select子句查出的结果可以是多个)
修改的问题 :
对于条件非常多或者非常复杂的修改操作,都应该先根据条件查,再修改
- '三年二班'的所有同学姓名
select cid from class where caption = '三年二班';
select sname from student where class_id = (select cid from class where caption = '三年二班'); - 男生人数和女生人数
select gender,count(*) from student group by gender; - 生物最高分
select cid from course where cname = '生物'
select max(number) from score where couse_id = (select cid from course where cname = '生物'); - 体育课平均分
select cid from course where cname = '体育'
select avg(number) from score where couse_id = (select cid from course where cname = '体育'); - 既选体育 又选物理的人名
找到体育的course_id
select cid from course where cname = '体育'
* 找到物理的course_id
select cid from course where cname = '物理'
* 找到选择体育的人,也在找物理的人名中
select student_id from score where course_id = (select cid from course where cname = '体育');
select student_id from score where course_id = (select cid from course where cname = '物理');
select student_id from (
select student_id from score where course_id = (select cid from course where cname = '体育')) as t1
inner join
(select student_id from score where course_id = (select cid from course where cname = '物理')) as t2
on t1.student_id = t2.student_id)
select * from studnet where sid in (
select student_id from (
select student_id from score where course_id = (select cid from course where cname = '体育')) as t1
inner join
(select student_id from score where course_id = (select cid from course where cname = '物理')) as t2
on t1.student_id = t2.student_id)
);
SELECT student.sname,GROUP_CONCAT(course.cname) FROM
course INNER JOIN score INNER JOIN student
ON course.cid=score.course_id AND student.sid=score.student_id
WHERE course.cname IN ('体育', '物理')
GROUP BY student.sname HAVING COUNT(course.cname)=2;
select s1.sname from student as s1
inner join
(select * from score as s inner join course as c on s.course_id = c.cid where c.cname in ('物理','体育')) as s2
on s1.sid = s2.student_id
group by s1.sname having count(s1.sid) = 2 ;
索引原理
b+树
- b 是balance 表示的是这个树最终是能够达到平衡的
- 数据不是平铺直叙的存储在硬盘山
- 影响查询速度的最重要的因素是树的高度
- 我们要做的事情,或者我们想要加速查询 降低树的高度
- 让索引的字段尽量的短
- 让索引的字段区分度高
- b+树和普通的b树比起来有什么区别
- 1. b+树只在叶子节点存数据
- 有利于降低树的高度
- 稳定查询所有数据的io次数
- 2. 在所有的叶子节点之间添加了双向链表
- 导致了所有的范围查询b+树的效率比b树高
- 1. b+树只在叶子节点存数据
- mysql中 innodb myisam的索引都是由b+树完成的
- innodb 支持 聚集索引(叶子节点存具体的数据) + 辅助索引(叶子节点存地址)
- 聚集索引也叫 聚簇索引
- myisam 只支持辅助索引,也叫非聚集索引
- innodb 支持 聚集索引(叶子节点存具体的数据) + 辅助索引(叶子节点存地址)
创建索引
create index 索引名字 on 表名(字段名)
create index ind_id on s1(id);
今日内容
索引
- 认识mysql中的key
- index key 普通索引,能够加速查询,辅助索引
- unique key 唯一 + 索引,辅助索引
- primary key 唯一 + 非空 + 聚集索引
- 主键作为条件的查询如果能够让索引生效那么效率总是更高
- foreign key 本身没有索引的,但是它关联的外表中的字段是unique索引
- primary key 和unique 标识的字段不需要再添加索引
- 直接就可以利用索引加速查询
- 能用unique的时候尽量不用index
- unique除了是索引之外还能做唯一约束,如果做了唯一约束
- b+树就更健康
- 正确的使用索引
- 创建索引 creeat index 索引名 on 表名(字段名)
- 删除索引 drop index 索引名 on 表名
- 1.条件一定是建立了索引的字段,如果条件使用的字段根本就没有创建索引,那么索引不生效
- 2.如果条件是一个范围,随着范围的值逐渐增大,那么索引能发挥的作用也越小
- 3.如果使用like进行模糊查询,那么使用a%的形式能命中索引,%a形式不能命中索引
- 4.尽量选择区分度高的字段作为索引列
- 5.索引列不能在条件中参与计算,也不能使用函数
- 6.在多个条件以and相连的时候,会优点选择区分度高的索引列来进行查询
- 在多个条件以or相连的时候,就是从左到右依次判断
- 7.制作联合索引
- 1.最左前缀原则 a,b,c,d 条件是a的能命中索引,条件是a,b能命中索引,a,b,c能命中,a,c.... 只要没有a就不能命中索引
- 如果在联合查询中,总是涉及到同一个字段,那么就在建立联合索引的时候将这个字段放在最左侧
- 2.联合索引 如果按照定义顺序,从左到右遇到的第一个在条件中以范围为条件的字段,索引失效
- 尽量将带着范围查询的字段,定义在联合索引的最后面
- drop index
- 如果我们查询的条件总是多个列合在一起查,那么就建立联合索引
- create index ind_mix on s1(id,email)
- select * from s1 where id = 1000000 命中索引
- select * from s1 where email = 'eva1000000@oldboy' 未命中索引
- 但凡是创建了联合索引,那么在查询的时候,再创建顺序中从左到右的第一列必须出现在条件中
- select count(*) from s1 where id = 1000000 and email = 'eva10%'; 命中索引
- select count(*) from s1 where id = 1000000 and email like 'eva10%'; 可以命中索引
- 范围 :
- select * from s1 where id >3000 and email = 'eva300000@oldboy'; 不能命中索引
- 1.最左前缀原则 a,b,c,d 条件是a的能命中索引,条件是a,b能命中索引,a,b,c能命中,a,c.... 只要没有a就不能命中索引
- 8.条件中涉及的字段的值必须和定义表中字段的数据类型一致,否则不能命中索引
- 关于索引的两个名词
- 覆盖索引 查一个数据不需要回表
- select name from 表 where age = 20 不是覆盖索引
- select age from 表 where age =20 是覆盖索引
- select count(age) from 表 where age =20 是覆盖索引
- 合并索引
- 当我们为单独的一列创建索引的时候
- 如果条件是这一列,且使用正确就可以命中索引
- 当我们为两列分别创建单独的索引的时候
- 如果这两列都是条件,那么可能只能命中期中一个条件
- 如果这两列都是条件,那么可能会命中两个索引 - 合并索引
- 我们为多列直接创建联合所以
- 条件命中联合索引
- 当我们为单独的一列创建索引的时候
- 覆盖索引 查一个数据不需要回表
- 执行计划
- 看看mysql准备怎么执行这条语句 可以看到是否命中索引,计划能命中哪些,实际命中了哪些,执行的顺序,是否发生了索引合并,覆盖索引
- explain select * from s1;
##数据库部分的拾遗
- pymysql
- 数据库备份和还原
- 使用事务和锁的方式来保证数据安全
Pymysql模块
import pymysql
查
conn = pymysql.connect(
host='127.0.0.1', user='root', password="123",
database='homework',
)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('select * from class')
ret1 = cur.fetchone() * cur记录着当前取到多少条了
print(ret1)
ret1 = cur.fetchone() * 不占用内存
print(ret1)
ret1 = cur.fetchone()
print(ret1)
ret= cur.fetchmany(8) * 分页
print(ret)
ret= cur.fetchall() * 因为占用内存所以不常用
print(ret)
cur.close()
conn.close()
conn = pymysql.connect(
host='127.0.0.1', user='root', password="123",
database='homework',
)
cur = conn.cursor()
cur.execute('insert into class (caption) values("六年三班")')
conn.commit()
cur.close()
conn.close()
conn = pymysql.connect(
host='127.0.0.1', user='root', password="123",
database='homework',
)
cur = conn.cursor()
cur.execute('update class set caption="四年三班" where cid=4')
conn.commit()
cur.close()
conn.close()
conn = pymysql.connect(
host='127.0.0.1', user='root', password="123",
database='homework',
)
cur = conn.cursor()
cur.execute('delete from class where cid=4')
conn.commit()
cur.close()
conn.close()
2019-04-26-day041-数据库的索引的更多相关文章
- 2019.04.26 mongaodb
打开服务 mongod.exe --dbpath E:\Develop\mongodb_64\data\db 在安装和打开服务之前要建一个db 文件的存储位置 然后打开服务 打开服务之后 打开图 ...
- 2016/04/26 流程 数据库lcdb 四个表 1,用户表users 2,流程表(设定有哪些流程)liucheng 3,流程发起者表(记录谁发起到哪里) 4,流程经过的人员表 flowpath (order排序)
流程: 十一 个页面 1,denglu.php(登录) <!DOCTYPE html> <html lang="en"> <head> ...
- 2016/04/26 权限 数据库mydb2 五个表 分别是 1,用户 2,角色 3,权限 4,用户对应的角色 5,角色对应的权限
权限: 1,后台分配角色 角色对应权限 2,各用户通过登录页面登录 查看到各自的权限 五个页面 加引入一个jquery-1.11.2.min.js 1,guanli.php ...
- MySQL/MariaDB数据库的索引工作原理和优化
MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了 ...
- Alpha冲刺(3/10)——2019.4.26
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(3/10)--2019.4.26 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- [04] SQL语句优化之索引
1.索引的概念 根据书的目录可以知道内容所在的页码,不用一页一页翻书,可直接通过页码找到内容.数据库的索引类似于书本的目录,索引指向内容存储位置,可直接定位到内容而不必扫描整张表,减少了磁盘的I/O次 ...
- PowerBI更新2019/04 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
Power BI 架构图 (2019/04) 1) Power BI Desktop 是一个免费的工具.它可以用来准备和管理数据模型:包括链接各种数据:做数据清洗:定义关系:定义度量值和层级关系:应用 ...
- 每日一练ACM 2019.04.13
2019.04.13 第1002题:A+B Proble Ⅱ Problem DescriptionI have a very simple problem for you. Given two in ...
- MySQL数据库对象-索引
1. 概述2. 索引分类2.1 不同索引的概念2.1.1 普通索引2.1.2 唯一索引2.1.3 全文索引2.1.4 多列索引3. 索引操作3.1 普通索引3.1.1 创建表时创建普通索引3.1.2 ...
- MySQL数据库之索引
1 引言 在没有索引的情况下,如果要寻找特定行,数据库可能要遍历整个数据库,使用索引后,数据库可以根据索引找出这一行,极大提高查询效率.本文是对MySQL数据库中索引使用的总结. 2 索引简介 索引是 ...
随机推荐
- 如何使用git拉取代码及提交代码(详细)
分享给刚进入公司的小伙伴们鸭! 第一步:首先在本地安装git和TorToiseGit小乌龟,svn同理,也可以安装下TorToiseGit中文语言包,前期可减少出错,后期熟悉了可直接用命令行pull代 ...
- XVI Open Cup named after E.V. Pankratiev. GP of Ekaterinburg--I.Iron man
n个服务器,k类任务,每个服务器完成一个任务都有特定的花费$cost_{i,j}$,但是你设置好某台机器去完成某项任务时他只能去完成这类任务,除非你可以花费$C$去更改配置.第$i$天要求去完成$q_ ...
- ImageWatch 无法安装在VS2017环境下的解决方案
Download: https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch#qna For Visua ...
- TPS,并发用户数,吞吐量以及一些计算公式
TPS,并发用户数,吞吐量以及一些计算公式 基本概念 TPS:每秒同时处理的请求数/事务数 并发数:系统同时处理的请求数/事务数 响应时间:一般去平均响应时间,只有当方差过大时,去90%的响应时间值 ...
- java Arrays.asList方法注意事项
1. 简介 Arrays.asList()方法可以将数组转化为长度固定的列表. 该方法强调了列表的长度是固定的,因此不能使用list的add和remove方法修改list长度. 2. 示例 impor ...
- MHA实现MySQL的高可用
一:软件简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件. 在 ...
- Jan.09
[10个可爱又迷人的加分俚语]1. Be in the air 将要发生的事情2. Clear the air 消除误会3. Cost an arm and a leg 极其昂贵4. A bad eg ...
- VS2015+VisualSVN+TortoiseSVN安装及使用
1. SVN 是什么 SVN 是 Apache Subversion 的缩写,是一个开放源代码的版本控制系.这些数据放置在一个中央资料档案库(repository) 中. 这个档案库很像一个普通的文件 ...
- (转)Jquery on()事件委派
今天浏览jQuery的deprecated列表,发现live()和die()在里面了,赶紧看了一下,发现从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一 ...
- gcc/g++编译器的安装与说明
gcc/g++编译器的安装与说明 1.gcc/g++编译器的安装 gcc yum install gcc g++ yum install gcc-c++ 2.gcc/g++的作用 将c/c++源代码编 ...