day39---mysql基础三
1、索引:
字典得目录,便于数据查找。
原理:将列信息存储在其相关的文件,这些信息使用便于检索的方式如B-tree、哈希来存储
索引的分类:
普通所有:name,只能帮助查找
唯一索引:name,帮助查找,约束内容不能重复,null,
也可做联合唯一索引
主键索引:与唯一索引类似,但不允许null,一张表只能有一个主键
支持联合主键
组合索引:多列公共组成索引
普通多列索引(name,email):用处不大
联合唯一索引(name,email):有用
全文索引:类似对长的字段做了一个分词的操作,对中文支持不好。
常用:solr ,lucence,sphix来做全文搜索
2、创建索引:
*普通索引:加快查找速度
验证:使用命令explain 若type 是all表示全表搜索,若为ref 表示通过索引搜索
*唯一索引:关键词unique
type =const ,查找效率高
*联合索引:索引最左原则,
单独使用右边的并不启用索引
3、正确的使用索引:
@*like ‘%xx’ 不走索引 like ‘xx%’走索引
@*使用函数 : select coun(1) from tb2 where reverse(name) = 'xxx' 不走索引,select coun(1) from tb2 where name = reverse('xxx') 走索引
@*or : select * from tb1 where nid = 1 or email = 'xxxx' ,nid email都有索引才走索引
@*类型不一致:select * from tb1 where name = 'xxxx' 会走索引,select * from tb1 where name = 111 不走索引
@*!= 和 > : 不走索引,特殊的 若该列为主键则走索引,否则不走索引;;;;;其他比较的走索引
@*orderby: select email from tb1 order by name desc 不走索引; select name form tb1 order by name desc 走索引
@*组合索引最左侧走索引,eg(name,email) name and email 走索引,name 走索引,email 不走索引
覆盖索引:所有数据都拿到叫做覆盖索引
索引合并:2个单个索引一起使用叫做索引合并
组合索引:2列做成一个索引
4、小知识:在加上limit后可在没有索引的时候可能会快速的完成查询
5、mysql 使用注意实现:
• 避免使用select *
• count(1) or count(列) 代替count(*)
• 创建表时尽量使用char代替varchar
• 表得字段顺序固定长度的字段优先
• 组合索引代替多个单列索引(经查使用多个条件查询时)
• 尽量使用短索引(否则会导致产生超大索引文件,方法在创建索引时列名标长度)
• 使用连接(join)来代替子查询(sub-Quries)
• 连表时注意条件类型要一致
• 索引散列值(重复少)不做索引,例:性别不适合
• 适度创建索引,不要过度创建
• 大批量导入导出数据时可先删除索引而后在添加索引以提高效率
6、分页的最佳方案:
select * from tb limit 200000,5;
第一种优化方案:
select * from tb1 where nid > (select nid from tb1 limit 200000,1 ) limit 5
此方案效率不高
第二种优化方案:
每页显示10条数据,供1000条
a. 上一页,下一页(使用应用传过来的nid值)
select * from tb1 where nid <9989 order by nid desc limit 10;
b. 上一页,100 99 98 97 96 95 94 下一页
select * from tb1 where nid <9989 order by nid desc limit 10;
#9989 ... 9959
select nid form (select nid from tb1 where nid < 9989 order by nid desc limit 40) as A order by nid asc limit 1 ;
select * from tb1 where nid < 动态最新id order by nid desc limit 10;
7、执行计划:
语法:explain + 查询SQL
id 表示查询个数 ,id大的先执行
8、慢查询:
*配置文件(win):win my-default.ini
slow_query_log = off
long_query_time = 2
slow_query_log_file = /xxxxx/log
log_queries_not_using_indexes = off -- 记录没有使用索引的查询
查看当前配置信息:
show GLOBAL VARIABLES like '%query%'
设置:
set global slow_query_log = on;
set global long_query_time =1 ;
set global log_queries_not_using_indexes = on
*查看mysql慢日志
eg: mysqldumpslow
-s at 需要我们关注
r 反序 a 显示全部值 g 匹配符合正则的结果 l 总时间不显示锁定时间
9、SQLAlchemy
SQLAlchemy 是python 下的一个ORM框架
SQLAlchemy 本身无法操作数据库,必须依靠pymysql等第三插件,Dialect拥有和数据api进行交流,依据配置文件得不同调用不同得数据api从而实现对数据库得操作。
1)底层处理
eg:
MySQL-Python
mysql+mysqldb://<
user
>:<
password
>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<
password
>@<host>/<dbname>[?<options>]
MySQL-Connector
mysql+mysqlconnector://<
user
>:<
password
>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://
user
:pass@host:port/dbname[?
key
=value&
key
=value...]
更多详见:http://docs.sqlalchemy.org/en/latest/dialects/
index
.html
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql # 创建连接
conn = pymysql.connect(host='10.10.8.12', port=3306, user='sysadmin', passwd='password01!', db='q2')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 执行SQL,并返回收影响行数
# effect_row = cursor.execute("UPDATE users set name = 'john1'") effect_row = cursor.execute("insert into users(name,password) VALUES ('john33','123.123')")
conn.commit()
#cursor.lastrowid 可获取自增列的id
print(cursor.lastrowid) # u = input("pls input username>>>>")
# p = input("pls input passwd>>>>>>")
# effect_row = cursor.execute("insert into users(name,password) VALUES (%s,%s)",(u,p)) #批量插入数据:
# effect_row = cursor.executemany("insert into users(name,password) VALUES (%s,%s)",
# [('john3','john3333'),('john5','john555')])
# print(effect_row)
# 提交,不然无法保存新建或者修改的数据
# conn.commit() #查询数据
# # effect_row = cursor.execute("select * from users")
# effect_row = cursor.execute('select * from users where nid > %s ORDER BY nid DESC ',(5,))
# #fetchall--- 拿到所有的数据, fetchone 第一次执行拿到第一个数据,第二次执行拿到第二个数据,
# #cursor.scroll(2, mode='relative')可用来移动游标
#
# # result = cursor.fetchall()
# # print(result)
# result = cursor.fetchone()
# print(result)
# result = cursor.fetchone()
# print(result)
# #游标的移动,mode="relative"相对移动,mode='absolute'绝对移动
# # cursor.scroll(-1, mode='relative')
# # cursor.scroll(2, mode='relative')
# cursor.scroll(0, mode='absolute')
# result = cursor.fetchone()
# print(result)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
coding demo
day39---mysql基础三的更多相关文章
- 04 mysql 基础三 (进阶)
mysql 基础三 阶段一 mysql 单表查询 1.查询所有记录 select * from department; select * from student; select * from ...
- mysql基础三(视图、触发器、函数、存储过程、事务、防注入)
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 1.创建视图 -格式:CREATE ...
- mysql基础(三)——中级查询
创建表 CREATE TABLE DEPT( DEPTNO ) PRIMARY KEY, DNAME ) , LOC ) ) ; ,'ACCOUNTING','NEW YORK'); ,'RESEAR ...
- MySQL 基础三 函数(聚合、字符串、时间、条件判断)
1.聚合 其它:GROUP_CONCAT.avg.sum.count.max.min SELECT typeid,GROUP_CONCAT(goodsname) FROM `goods` GROUP ...
- Mysql基础(三)
#DML语言 /* 数据操作语言 插入:insert insert into 表名(列名,...) values(值1,...); insert into 表名 set 列名=值, 列名=值,... ...
- MySQL基础(三)——约束
MySQL基础(三)--约束 约束是在表上强制执行的数据校验规则,主要用于维护表中数据的完整性以及当数据之间有以来关系时,保护相关的数据不会被删除. 根据约束对列的限制,可以划分为:单列约束(只约束一 ...
- { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型
MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...
- Mysql基础(三):MySQL基础数据类型、完整性约束、sql_mode模式
目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 2. 完整性约束 3. MySQL的sql_mode模式说明以及设置 2.MySQL基础数据类型.完整 ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...
- Mysql基础代码(不断完善中)
Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...
随机推荐
- JQuery初识(三 )
一丶JQuery的文档操作 1.插入操作: 父元素.append(子元素) 解释:追加某元素,在父元素中添加新的子元素.子元素可以为:stirng|element(js对象)|JQuery元素 var ...
- css清除浮动好方法
1.clear:both ==>IE6,7会有高度,所以去高度需要.clear{ clear:both; height:0px; margin:0; padding:0; width:0; bo ...
- 零基础逆向工程29_Win32_03_ESP寻址_定位回调函数_子窗口_消息处理函数
1 Win32应用程序入口识别 思路:根据WinMain的四个参数,由调用顺序,知道最后压栈的是hInstance句柄(也就是WinMain函数的第一个参数,其值等于ImageBase),根据反汇编, ...
- tas5717/5719功放问题点总结
问题一 AMP output channel invert problem and modification 原因:如果硬件设计时,耳机或者喇叭的输出通道反了,就要对其进行左右对换. 对策:如果通道反 ...
- ajax请求成功后js刷新当前页,当前页是post查询结果(用post请求进行搜索筛选)的问题
下面的一个ajax操作,原先操作成功会刷新当前页,保证用户看到的数据是最新的,一般情况不会出现问题.$.ajax({ url: url + "/addTeacherAuth", / ...
- Unix系统中常用的信号含义
http://blog.csdn.net/u012349696/article/details/50687462 编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ...
- swift和oc之间的相互调用(block,代理)
第一:swift->oc 这个相对简单一点, 在自动生成的桥接文件中导入你要掉的oc文件名就可以了, 如果没有生成桥接文件也可以自己手动创建(Header File) 第二:oc->swi ...
- Java统计用户年/月/周/日网站访问量
一:准备工作,引入相关依赖: 二:运行效果图: 下一次访问 三:具体代码如下 (1):CountObjectInfo.java package cn.csrc.base.count; import ...
- MySQL的入门与使用,sqlyog对数据库,表和数据的管理
MySQL的入门 1.到mysql官网下载. 2.安装mysql软件(一定要放到英文路径下) 3.使用 验证是否成功 将mySQL的bin路径添加到系统环境变量Path中 打开dos命令窗口 Wind ...
- rem适配方案
页面布局单位计算 一般有两大类:绝对长度单位和相对长度单位 绝对长度单位: px 像素:是显示屏上显示的每一个小点,为显示的最小单位 in 英寸,1in = 96px cm 厘米,1cm = 37.8 ...