索引概述
    每种存储引擎对每个表至少支持16个索引,总索引长度至少256字节.
    MyISAM和InnoDB的表默认创建BTREE索引.MEMORY引擎默认使用HASH索引,但也支持BTREE
    MySQL目前不支持函数索引,但支持前缀索引.
    MyISAM支持的前缀索引最大长度为1000字节;InnoDB支持的前缀索引最大程度是767字节.
    CREATE TABLE 创建索引时是按照字符数计量的,所以对于多字节的字符集,要考虑字符和字节的关系.
    MySQL还支持FULLTEXT(全文本)索引,用于全文搜索.5.0版本目前只有MyISAM存储引擎支持FULLTEXT索引,且只限于CHAR,VARCHAR,TEXT类型的数据列.
    索引总是对整个行进行的,不支持局部(前缀)索引.
 
    创建索引的语法:
        CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
            [USING index_type]
        ON tbl_name (index_col_name,...) ;
 
    也可以使用ALTER TABLE 语法增加索引.  
          ALTER TABLE tbl_name ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX idx_name index_col_name ;
 
 
        index_col_name :
            col_name[(length)] [ASC|DESC]
    
    删除索引的语法
        DROP INDEX index_name ON tbl_name ;
 
 
索引设计原则:
 
    1).搜索的索引列:
            是指出现在WHERE字句中的列,或连接子句中指定的列;而不是SELECT关键字后的列.
    2).使用唯一索引:
            索引的列的基数越大,索引效果越好.比如存放生日的列具有不同值,可以区分出各行;而存放性别的列,只有'F'或'M' , 搜索出来的基本五五开,索引的意义就不大.
    3).使用短索引:
            如果对字符串进行索引,应该指定一个前缀长度.例如有个CHAR(200)的列,如果在前10-20个字符内,多数值是唯一的,那就不要对整个列进行索引.这样磁盘I/O操作更少,缓存中的块能容纳更多的键值对.
    4).利用左前缀: -- todo 这tm解释,作者你自己能看懂嘛?
            在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引.多列索引可起到多个索引的作用,因为可利用索引中最左边的列集来匹配行.这样的列集被称为最左前缀.
    5).不要过度使用索引,
            过犹不及.多了,或者很多不需要的索引会导致磁盘IO.修改表也会对索引进行更新甚至重构.也会给查询优化带来更多的工作.也会导致MySQL在查询时使用不到最好的那个索引.
    6).对于InnoDB存储引擎的表
            记录的保存顺序:
                  有明确主键,按照主键顺序;
                  没有主键但有唯一索引列,按索引列顺序;
                  没有唯一索引,MySQL生成内部列,按照内部列排序;
 
            使用主键/内部列进行访问是最快的.所以InnoDB表尽量显示指定主键.
            如果同时有几列都是唯一的,都可以作为主键,选择比较短的数据类型.可以减少磁盘IO,以及提高索引效果.
 
 
BTREE索引与HASH索引
    HASH索引:
        只用于使用 = , <=> 这种操作符进行等式比较.
        优化器不能使用HASH索引来加速ORDER BY 操作.
        MySQL不能确定在两个值之间大概有多少数据行.如果将MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率.
        只能使用整个关键字来搜索一行.
 
    BTREE索引:
        当是一哦那个>,<,>=,<=,BETWEEN,!=,<> 或者LIKE 'pattern'(其中pattern不以*开头) , 都可以使用相关列上的索引.
 
    范围查询时,HASH索引,其实还是扫描的全盘,而BTREE则是范围搜索.
    可以使用 EXPLAIN 语句来观察.如 : explain SELECT * FROM tbl_name WHERE .... ;
 

10 MySQL索引选择与使用的更多相关文章

  1. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  2. 10.Mysql索引

    10.索引的设计和使用10.1 索引概述BTREE索引:Mysql(MyIASM和Innodb)默认的索引类型.前缀索引:对索引字段的前N个字符创建索引.N的最大取值和存储引擎有关,MyIASM支持最 ...

  3. MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式

    一 表结构如下: CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) un ...

  4. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10 ...

  5. MySQL索引选择及添加原则

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  6. MySQL索引选择及规则整理

    索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...

  7. 表数据量影响MySQL索引选择

    现象 新建了一张员工表,插入了少量数据,索引中所有的字段均在where条件出现时,正确走到了idx_nap索引,但是where出现部分自左开始的索引时,却进行全表扫描,与MySQL官方所说的最左匹配原 ...

  8. 七、mysql索引选择

    .myisam,bdb,innodb,memory 单表至少支持16个索引 .create index id_index on emp (id) 为emp表创建一个名为id_index的id字段的索引 ...

  9. MySQL索引那些事

    原文链接 大家有没有遇到过慢查询的情况,执行一条SQL需要几秒,甚至十几.几十秒的时间,这时候DBA就会建议你去把查询的 SQL 优化一下,怎么优化?你能想到的就是加索引吧? 为什么加索引就查的快了? ...

随机推荐

  1. Python - metaclass元类

    参考 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919 ...

  2. 在Linux上用Apache搭建Git服务器

    在Linux上用Apache搭建Git服务器   最近在学Linux,终于在Linux上用Apache搭建起了Git服务器,在此记录一下. 服务器:阿里云服务器 Linux版本:CentOS 6.5 ...

  3. mysql将一个表拆分成多个表(一)(转载)

    转载 直接根据数据量进行拆分 有一个5000条数据的表,要把它变成没1000条数据一个表的5等份. 假设:表名:xuesi 主键:kidxuesi共有5000条数据,kid从1到5000自动增长题目: ...

  4. 《精通Objective-C》书籍目录

    1.入门 2.使用类 3.对象和消息传递 4.内存管理 5.预处理器 6.专家级技巧:使用ARC 7.运行时系统 8.运行时系统的结构 9.专家级技巧:使用运行时系统API 10.Foundation ...

  5. LeetCode206. Reverse Linked List(反转链表)

    题目链接:https://leetcode.com/problems/reverse-linked-list/ 方法一:迭代反转 https://blog.csdn.net/qq_17550379/a ...

  6. 还是应该立个flag

    6月份 开通博客的想法很简单,就是决定要学习C++和算法,写博客作为督促自己的一个方式,因为还没有系统的学习,自认为写博客或见解有些力所不及,决定先从自己的一篇随笔开始,因为我知道自己一旦开始,就会坚 ...

  7. 如何书写高效的MySQL查询?

    How to write efficient MySQL query statements WHERE子句中的书写注意事项 模糊查询(like)时需要注意的事项 索引 字段类型 表连接时的注意事项 其 ...

  8. 解决dotnet-Angular的跨域(cors)问题

    解决dotnet-Angular的跨域(cors)问题 前言 之前学了点 Angular ,打算用 dotnet core 做后端,之前没接触过这方面的东西,理所当然的遇到了跨域问题,之后也解决了,所 ...

  9. 关于python中format占位符中的 {!} 参数

    在看celery的时候,发现里面有这么一句 print('Request: {0!r}'.format(self.request)) 关于里面的{0!r}是什么意思翻了一下文档. 文档里是这么描述的 ...

  10. 十四 数据库连接池&DBUtils

    关于数据库连接池: 1 数据库的连接对象创建工作,比较消耗性能. 2 一开始在内存中开辟一块空间,往池子里放置多个连接对象,需要连接的时候从连接池里面调用, 使用完毕归还连接,确保连接对象能够循环利用 ...