索引,sql收尾

1.索引原理

磁盘预读:4096字节b树:balance treeb+树:数据只存储在叶子节点;在子节点之间加入了双向地址连接,更方便地在子节点之间进行数据的读取索引原理innodb: 聚集索引:对主键创建索引,并将该行所有数据存到树形结构里 辅助索引:除了主键之外所有的索引都是辅助索引 回表:只查询一个索引并不能解决查询中的问题,还需要到具体的表 中去获取整行数据myisam:只有辅助索引索引种类:primary key 非空 + 唯一 + 聚集索引unique 唯一 + 辅助索引index 普通索引(辅助索引)创建索引:create index index_name on 表(字段); # 创建索引后查询效率大幅提高,文件所占硬盘资源大幅提高删除索引:drop index index_name on 表;索引优缺点: 优:查找速度快 缺:浪费空间,拖慢写的速度 #不要在程序中创建无用的索引

2.正确使用索引

1.所查询的列不是创建了索引的列2.在条件中不能带运算或者函数,必须是“字段 = 值”3.如果创建索引的列的内容重复率高也不能有效利用索引 # 重复率不超过10%的列比较适合做索引4.数据对应的范围如果太大的话,也不能有效利用索引 # between and > < >= <= != not in5.like如果把%放在最前面也不能命中索引6.多条件情况 and:只要一个条件列是索引列就可以命中索引 or:只有所有条件列都是索引才能命中索引7.联合索引:在多个条件相连的情况下,使用联合索引的效率要高于使用单字段的索引create index index_mix on 表(字段a,字段b); 1.创建索引的顺序a,b条件中从哪一个字段开始出现了范围,索引就失效 2.联合索引在使用的时候遵循最左前缀原则 3.联合索引中只有使用and能生效,使用or失效

3.mysql收尾

explain:查看sql语句的执行计划explain select * from 表 where 条件; # 查看是否命中了索引,命中的索引的类型覆盖索引: explain出来的是using index;不用回表索引合并: explain出来的是 using union;创建索引的时候分开创建的,用的时候(or的多条件情况下)合一起了mysql开启慢日志:通过配置文件开启,筛选出程序中耗时长的sql语句七表查询速度慢怎么办?1.表结构:尽量用固定长度的数据类型代替可变长数据类型;把固定长度的字段放在前面2.数据的角度:如果表中的数据越多,查询效率越慢 列多:垂直分表 行多:水平分表3.sql的角度: 尽量把条件写细致,where条件多做筛选 多表情况下尽量连表代替子查询 创建有效的索引,规避无效索引4.配置角度:开启慢日志,确认有问题的sql语句5.数据库:读写分离(解决数据库读的瓶颈)数据库的导入导出备份表: mysqldump -uroot -p123 数据库 > 地址 # 整个库的表和数据 mysqldump -uroot -p123 库名 表名 表名 > 地址 # 单表(多表)的数据备份库: mysqldump -uroot -p123 --databases 库名 库名 > 地址 # 多库恢复数据: 进入mysql切换到要恢复数据的库下面 sourse 之前备份的地址开启事务,给数据加锁(行级锁)begin;select 字段 from 表 where 条件 for update;update 表名 set 字段 = 值 where 条件;commit;

4.sql注入

import pymysqlconn = pymysql.connect(host='127.0.0.1', user='root', password="123",database='day42')cur = conn.cursor()user = "kunkun' or 1=1 ;-- " # 因'--'注释的特性,导致此种写法形成sql注入password = '*******'sql = "select * from userinfo where username = %s and password =%s;"cur.execute(sql,(user,password))ret = cur.fetchone()print(ret)cur.close()conn.close()

相关文章