zoukankan      html  css  js  c++  java
  • 索引

    索引   实际上就是一张表中数据的目录,可以任意选择能够做目录的字段

    balance tree 平衡树

    让目录的数据结构变得合理化

    缺点:

    查询每一个数据所需要的io是不一样的,不是很稳定

    取范围的时候,需要向上一个数据页去寻找

    b+树      以平衡树为基础

    所有的数据都存储在叶子节点,查找数据时候的IO更加稳定

    叶子节点与叶子节点之间的地址通过一个双向的指针相连,查找范围的时候更简便

    innodb索引的数据结构是b+树 一次性默认读取数据16k

    数的高度决定了IO次数,数据的长度越短,作为索引能够建立的这个树形结构越矮,效率越高

    应该使用区分度大的内容来作为索引列

    innodb和myisam的索引的存储方式

    innodb内部 有聚集索引(聚簇索引),叶子节点除了存储索引,还存储值 磁盘预读性原理 和非聚集索引

    innodb必须有一个主键,即使没有,mysql也会自动添加一列作为这张表的主键

    myisam 内部没有聚集索引,所有索引都是非聚集索引

    索引的种类

    primary key 除了约束 非空+唯一之外,还有其他的作用 聚集索引 全表只能有一个聚集索引

    unique 约束 唯一 非聚集索引的作用

    index 没有约束的作用 普通的非聚集索引

    正确使用索引

    create index ind_id on s1(id)

    innodb中 所有的索引数据和存储的数据是存在一个文件里的

    创建索引必然会拖慢写的速度

    如果没有索引,是全表扫描,有了索引,就可以根据目录快速找到数据

    正确使用索引:

    1.条件必须是已经创建索引的列

    2.如果在条件中对索引列使用了范围,并且范围很大,那么速度会很慢

    3.like 后面必须是'确定内容%' 是可以用索引加速查询的 如果是like '%内容',是不能用索引查询的

    4.确认使用的索引列的区分度 选择区分度低的列作为索引实际上不会有加速查找的效果

    5.索引列在条件中不能参与计算

    and/or

    使用and条件的时候,mysql在优化查询的时候会优先选择区分度高的列先查询,来缩小其他条件要查询的范围

    or条件 只会从左到右依次进行判断,不会加快查询速度,除非条件中出现的所有列区分度都很高,每一个字段都要添加所有

    联合索引

     create index 索引名 on 表名(字段1,字段2)

    最左前缀匹配原则:必须带上字段1进行索引

    覆盖索引

    要查找的字段是条件中筛选的字段

    # select name from 表 where id =10000 # 用到索引了 ,但是不是覆盖索引

    # select id from 表 where id =10000 # 用到索引了 ,也是覆盖索引

    # select count(id) from 表 where id >10000 # 用到索引了 ,也是覆盖索引

    索引合并

    对单列进行索引的创建

    id email

    # 使用了两个条件id = 100000 or email = 'eva100000@oldboy';

    删除索引

    drop index 索引名 on 表名

    python操作数据库

    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1',user='root',password=None,database='db3')
    cursor = conn.cursor()
    sql = 'select * from employee where post = "teacher";'    #将sql语句封装起来,用sql变量接收
    cursor.execute(sql)
    # ret = cursor.fetchall()    #显示全部的值
    # ret = cursor.fetchone()    #显示一个值
    ret = cursor.fetchmany(2)    #可以指定值显示,括号内不写数字默显示一个值
    print(ret)
    conn.close()

    事务和锁

    begin; # 开启事务

    select * from emp where id = 1 for update; # 查询id值,for update添加行锁;

    update emp set salary=10000 where id = 1; # 完成更新

    commit; # 提交事务

    避免同时修改数据库中的数据,造成数据不安全,在修改时,利用事务保证数据安全

    注意 sql语句只能一条一条赋值然后执行,不能把整个事务的sql语句一起赋值

    import pymysql
    
    conn = pymysql.connect(host='127.0.0.1',user='root',password=None,database='db3')
    cursor = conn.cursor()
    sql1 = 'begin;'
    sql2 = 'select * from employee where id = 1 for update;'
    sql3 = 'update employee set salary=9000 where id = 1;'
    sql4 = 'commit;'
    cursor.execute(sql1) 
    cursor.execute(sql2)
    cursor.execute(sql3)
    cursor.execute(sql4)     #逐条执行
    conn.close()

    数据库备份

    mysqldump -uroot -p123 数据库名 > 路径                # 备份所有的表以及数据
    create database 数据库名
    use 数据库
    mysql> source 文件的路径
    备份表
    mysqldump -uroot -p123 --databases homework > 路径下    # 备份这个库和所有的表以及数据
    source 文件路径
    备份数据库
  • 相关阅读:
    团队开发冲刺第二十天
    团队开发冲刺第十九天
    第十六周进度总结
    学期课后个人总结
    用户场景分析
    第十五周进度总结
    对正在使用的输入法进行评价
    java中实现客户姓名添加和显示
    指定查找区间,查找学生姓名并显示是否修改成功
    linux下如何修改文件的权限chmod
  • 原文地址:https://www.cnblogs.com/sandy-123/p/10517100.html
Copyright © 2011-2022 走看看