多列索引

多列索引对查询的影响
  假定你发出下列SELECT语句:
    mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
  如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。
  如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。
  你可以这样创建一个多列索引:
    mysql>ALTER TABLE tbl_name ADD INDEX(col1,col2);
  而你应该这样创建分开的单行列索引:
    mysql>ALTER TABLE tble_name ADD INDEX(col1);
    mysql>ALTER TABLE tble_name ADD INDEX(col1); 
  如果表有一个多列索引,任何最左面的索引前缀能被优化器使用以找出行。例如,如果你有一个3行列索引(col1,col2,col3),你已经索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。
  如果列不构成索引的最左面前缀,MySQL不能使用一个部分的索引。
  假定你下面显示的SELECT语句:
  mysql> SELECT * FROM tbl_name WHERE col1=val1;
  mysql> SELECT * FROM tbl_name WHERE col2=val2;
  mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; 
  如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。
  第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。

  如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。
  例如,下列SELECT语句使用索引:
    mysql> select * from tbl_name where key_col LIKE "Patrick%";
    mysql> select * from tbl_name where key_col LIKE "Pat%_ck%"; 
  在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。

  下列SELECT语句将不使用索引:
    mysql> select * from tbl_name where key_col LIKE "%Patrick%";
    mysql> select * from tbl_name where key_col LIKE other_col; 
  在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。
  如果 column_name 是一个索引,使用column_name IS NULL的搜索将使用索引。

参考:http://blog.csdn.net/tsuliuchao/article/details/4877157

时间: 2024-09-29 23:06:48

多列索引的相关文章

mybatis查询oracle ’无效的列索引‘和ORA-00911’无效的字符‘错误

1.Caused by: java.sql.SQLException: 无效的列索引 参考文献:http://bbs.csdn.net/topics/300179772 配置的sql语句写错了 select distinct '#{pkgName}' as pkgName, '#{appName}' as appName, version as versionName from stat_dim_version where appkey=#{appKey} order by version de

多列索引生效规则

mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a,b,c..这样排好序的:所以你在找东西的时候才快,比如你找 "中" 这个字的解释,你肯定就会定位到目录的 z 开头部分: 组合索引可以这样理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的: 组合索引的生效原则是  从前往后依次使用生

mysql 多列索引优化

Mysql所有的列都可以使用索引,.对相关列使用索引是提高SELECT操作性能的最佳途径.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少256字节.在索引中使用col_name(length)语法,可以创建一个只使用char和archar列的第一个length个字符的索引,按这种方式只索引列的前缀可以索引文件小的多.MyISAm和INNODb存储引擎还支持对blob和text列的索引,但是必须指定索引长度.fulltext索引用于全文搜索不

DevExpress实现根据行,列索引来获取RepositoryItem的方法

/// <summary> /// 根据行,列索引来获取RepositoryItem /// </summary> /// <param name="view">GridView</param> /// <param name="rowIndex">行索引</param> /// <param name="columnIndex">列索引</param>

JFinal ActiveRecordException: 无效的列索引

代码: Db.update("delete from T_Xabc where ID= '?'","9900"); 现象: com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: 无效的列索引 at com.jfinal.plugin.activerecord.DbPro.update(DbPro.java:279) at com.jfinal.plugin.activ

postgresql 9.6 建立多列索引测试

建立测试表结构 CREATE TABLE t_test ( id integer, name text COLLATE pg_catalog."default", address character varying(500) COLLATE pg_catalog."default" ); 插入测试数据 insert into t_test SELECT generate_series(1,10000000) as key, 'name'||(random()*(10

java.sql.SQLException: 无效的列索引

“无效的列索引”其实是个低级的错误,原因无非几个: 1.sql串的?号数目和提供的变量数目不一致: 例如:jdbcTemplate.update(sql, new Object[] {newState,oldState}); 如果sql里面有1个?号,Object[]送了2个,就会报错. 2.sql串里的?号书写不正确 英文?和中文?有时难以区分. 3.sql串的?号用''括了起来. 例如:sql="UPDATE abc SET abc.name='?' WHERE abc.id='?'&quo

求两个对角向上、列索引是偶数的元件和。

//求两个对角向上.列索引是偶数的元件和. #include <stdio.h> int main() { int sum=0; int i,j; int a[5][5]; //为数组赋值 for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&a[i][j]); } } //求两条对角线上行.列下标均为偶数的各元素之和. for(i=0;i<5;i++) { for(j=0;j<5;j++) {

oracle 单列索引 多列索引的性能测试

清除oralce 缓存:alter system flush buffer_cache; 环境:oracle 10g . 400万条数据,频率5分钟一条 1.应用场景:  找出所有站点的最新一条数据.sql语句如下: —————————————————————————————————————————————————— with aa as( select t1.EQP_ID ,max(MEASURE_TIME) maxtm from PLU_WATER_DATA t1 where t1.MEAS

Atitit.&#160;&#160;单列索引与多列索引&#160;多个条件的查询原理与设计实现

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,lastname,age).(firstname,lastname)以及(firstname)这些列组合上的索引.2 2. 一条 sql 可以使用多个索引2 2.1. 什么是索引合并2 2.2. 使用索引合并有啥收益3 2.3. 具体的索引合并流程 4 3. Referred.4 1. MySQL只能使用一