美文网首页MySQL专栏
第二弹:数据类型与索引

第二弹:数据类型与索引

作者: lvyz0207 | 来源:发表于2020-06-09 23:00 被阅读0次

    7、数据类型

    • 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
    • 浮点数类型:FLOAT、DOUBLE、DECIMAL
    • 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
    • 日期类型:Date、DateTime、TimeStamp、Time、Year
    • 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

    8、字符串(char,varchar,_text)

    • char类型存储的字符串末尾不能有空格,varchar不限于此。
    • char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节
    • varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255)
    • char类型的字符串检索速度要比varchar类型的快
    • text类型不能有默认值,索引不起作用
    • BLOB 保存二进制数据,TEXT 保存字符数据。
    MySQL数据类型 含义
    date 日期 '2020-05-09'
    time 时间 '23:59:59'
    datetime 日期时间 '2020-05-09 23:59:59'
    timestamp 自动存储记录修改时间
    数据类型 字节长度 范围或用法
    Bit 1 无符号[0,255],有符号[-128,127]
    TinyInt 1 整数[0,255]
    SmallInt 2 无符号[0,65535],有符号[-32768,32767]
    MediumInt 3 无符号[0,224-1],有符号[-223,2^23-1]]
    Int 4 无符号[0,232-1],有符号[-231,2^31-1]
    BigInt 8 无符号[0,264-1],有符号[-263 ,2^63 -1]
    Float(M,D) 4 单精度浮点数。D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
    Double(M,D) 8 双精度浮点。
    Decimal(M,D) M+1或M+2 未打包的浮点数,用法类似于FLOAT和DOUBLE,

    9、索引

    帮助MySQL高效获取数据的数据结构
    目的:提高查询效率
    索引本身一般以索引文件的形式存储在磁盘上

    # 创建索引
    CREATE INDEX indexName ON mytable(username(length)); 
    
    # 修改表结构创建索引
    ALTER table tableName ADD INDEX indexName(columnName)
    
    # 唯一索引
    CREATE UNIQUE INDEX indexName ON mytable(username(length)); 
    ## 有四种方式来添加数据表的索引:
    
    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
    ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
    ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
    ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
    
    # 删除索引
    DROP INDEX [indexName] ON mytable; 
    mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
    

    10、索引结构

    索引是在存储引擎中实现的,InnoDB默认为B+Tree树
    主键索引:InnoDB的数据文件本身就是主键索引文件,被称为“聚簇索引”,一个表只能有一个聚簇索引。

    辅助索引:非主键索引接口的叶子节点存储的是主键值

    hash索引:底层是hash表,是一种key-value的存储结构,无序,查询时造成全表扫描;不支持最左匹配原则,大量键值重复时,造成hash碰撞,索引效率低

    full-text全文索引:用于全文索引,替代效率较低的LIKE模糊匹配操作。

    R-tree空间索引:用于地理空间数据类型

    B树与B+树

    B树的每个节点都存储数据,而B+树只有叶子节点才存储数据,所以查找相同数据量的情况下,B树的高度更高,IO更频繁。
    同时,MySQL底层对B+树进行进一步优化:在叶子节点中是双向链表,且在链表的头结点和尾节点也是循环指向的。

    回表操作:
    在辅助索引上检索name,到达其叶子节点获取对应的主键;
    使用主键在主索引上再进行对应的检索操作
    后续文章会有专文详解B树、B+Tree和B-Tree树

    11、索引使用条件

    需要索引时:

    • 主键自动建立唯一索引
    • 频繁作为查询条件的字段
    • 查询中与其他表关联的字段,外键关系建立索引
    • 单键/组合索引的选择问题,高并发下倾向创建组合索引
    • 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
    • 查询中统计或分组字段

    不需要索引情况时:

    • 表记录太少
    • 经常增删改的表
    • 数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
    • 频繁更新的字段不适合创建索引(会加重IO负担)
    • where条件里用不到的字段不创建索引
    **高效索引--覆盖索引
    查询列要被所建的索引覆盖,不需要进行回表操作。   
    ** 索引的最左匹配原则成因:
    最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
    **索引是建立的越多越好吗?
    数据量小的表不需要建立索引,增加索引会产生额外的开销
    数据变更需要维护索引,更多的索引需要占用更多的资源
    更多索引需要更多的空间   
    **为什么要使用索引?   
    避免全表扫描,提升检索效率
    **什么样的信息能成为索引?   
    主键、唯一键和普通键   
    **索引的数据结构?   
    二叉查找树建立二分查找
    B-树、B+树、Hash结构
    **密集索引和稀疏索引和区别?   
    密集索引每个搜索码都对应一个索引项
    稀疏索引只为部分搜索码建立索引项
    
    rose

    相关文章

      网友评论

        本文标题:第二弹:数据类型与索引

        本文链接:https://www.haomeiwen.com/subject/yojytktx.html