zoukankan      html  css  js  c++  java
  • Python-mysql索引

    MySQL索引的概念

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
    索引类别
    1.普通索引
    普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column =)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
    2.唯一索引
    普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。
    如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE 把它定义为一个唯一索引。这么做的好处:一是简化了 MySQL 对这个索引的管理工作,这个索引也因此而变得更有效率;二是 MySQL 会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL 将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
    3.主索引
    在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是 PRIMARY 而不是 UNIQUE。
    4.外键索引
    如果为某个外键字段定义了一个外键约束条件,MySQL 就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。
    5.复合索引
    索引可以覆盖多个数据列,如像 INDEX (columnA, columnB) 索引。这种索引的特点是 MySQL 可以有选择地使用一个这样的索引。如果查询操作只需要用到 columnA 数据列上的一个索引,就可以使用复合索引 INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX (A,B,C) 可以当做 A 或 (A,B) 的索引来使用,但不能当做 B、C 或 (B,C) 的索引来使用。
    
    
    mysql主键和索引的区别:
    1. 主键一定是唯一性索引,唯一性索引并不一定就是主键。 
    
    所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。 
    
    主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。 
    
    2. 一个表中可以有多个唯一性索引,但只能有一个主键。 
    
    3. 主键列不允许空值,而唯一性索引列允许空值。 
    
    5.	索引可以提高查询的速度。
    
    

    python 创建索引

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @Time   : 2017/11/24 0:58
    # @Author : lijunjiang
    # @File   : index.py
    import MySQLdb
    
    sql = '''alter table Score add index idx_StdID_CouID(StdID,CouID)'''
    sql1 = '''alter table Score add index idx_CouID_StdID(CouID,StdID)'''
    
    def connect_mysql():
        db_config = dict(host="11.11.11.11", port=3306, db="python", charset="utf8", user="python", passwd="python")
        try:
            cnx = MySQLdb.connect(**db_config)
        except Exception as err:
            raise err
        return cnx
    
    if __name__ == "__main__":
        cnx = connect_mysql()  # 连接mysql
        cus = cnx.cursor()     # 创建一个游标对象    try:
        try:
            cus.execute(sql)
            cus.execute(sql1)
            cus.close()
            cnx.commit()
        except Exception as err:
            cnx.rollback()
            raise err
        finally:
            cnx.close()
    

    运行前:

    mysql> EXPLAIN SELECT * from Score WHERE stdID=1045;
    +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
    +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
    |  1 | SIMPLE      | Score | ALL  | NULL          | NULL | NULL    | NULL | 10000 | Using where |
    +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
    
    

    运行后:

    mysql> EXPLAIN SELECT * from Score WHERE stdID=1045;
    +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------+
    | id | select_type | table | type | possible_keys   | key             | key_len | ref   | rows | Extra |
    +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------+
    |  1 | SIMPLE      | Score | ref  | idx_StdID_CouID | idx_StdID_CouID | 4       | const |   20 |       |
    +----+-------------+-------+------+-----------------+-----------------+---------+-------+------+-------+
    1 row in set (0.00 sec)
    
    
  • 相关阅读:
    杭电 搜索 1253 胜利大逃亡
    杭电 搜索 1258 Sum It Up
    杭电搜索 2612 Find a way
    杭电 搜索 水题1072 Nightmare
    杭电1175简单搜索 连连看
    杭电 1372 Knight Moves
    杭电 oj Rescue 1242
    杭电 1241 Oil Deposits
    杭电 2100 Children’s Queue
    杭电 1103 Flo's Restaurant
  • 原文地址:https://www.cnblogs.com/lijunjiang2015/p/7888071.html
Copyright © 2011-2022 走看看