zoukankan      html  css  js  c++  java
  • Mysql的列索引和多列索引(联合索引)

    转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html

    创建一个多列索引:
    CREATE TABLE test (  
        id         INT NOT NULL,  
        last_name  CHAR(30) NOT NULL,  
        first_name CHAR(30) NOT NULL,  
        PRIMARY KEY (id),  
        INDEX name (last_name,first_name)  
    );  
    创建多个索引:
    CREATE TABLE test (  
        id         INT NOT NULL,  
        last_name  CHAR(30) NOT NULL,  
        first_name CHAR(30) NOT NULL,  
        PRIMARY KEY (id),  
        INDEX name (last_name),  
         INDEX_2 name (first_name)  
    );  
    当查询语句的条件中包含last_name 和 first_name时,
    例如:SELECT * FROM test WHERE last_name='Kun' AND first_name='Li';  
    sql会先过滤出last_name符合条件的记录,在其基础上再过滤first_name符合条件的记录。那如果我们分别在last_name和first_name上创建两个列索引,mysql的处理方式就不一样了,它会选择一个最严格的索引来进行检索,可以理解为检索能力最强的那个索引来检索,另外一个利用不上了,这样效果就不如多列索引了。
    但是多列索引的利用也是需要条件的,以下形式的查询语句能够利用上多列索引:
    SELECT * FROM test WHERE last_name='Widenius';
    SELECT * FROM test WHERE last_name='Widenius' AND first_name='Michael';
    SELECT * FROM test WHERE last_name='Widenius' AND (first_name='Michael' OR first_name='Monty');
    SELECT * FROM test WHERE last_name='Widenius' AND first_name >='M' AND first_name < 'N';
    以下形式的查询语句利用不上多列索引:
    SELECT * FROM test WHERE first_name='Michael';
    SELECT * FROM test WHERE last_name='Widenius' OR first_name='Michael';
    多列建索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高。
     
  • 相关阅读:
    现代程序设计 homework-07
    现代程序设计 homework-05
    现代程序设计 homework-04
    [现代程序设计]homework-03
    [软件工程--个人作业] 敏捷开发读后感
    软件工程 --- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] [附加题]
    【现代程序设计】加分作业2-《代码大全》第18章表驱动法阅读报告
    【现代程序设计】加分作业1-对Stack的理解
    【现代程序设计】homework-10
    【现代程序设计】homework-09
  • 原文地址:https://www.cnblogs.com/onmyway20xx/p/4194312.html
Copyright © 2011-2022 走看看