mysql 用不到索引的语句

在mysql中, 以key(a, b, c)为例子:

  1. 跳过列,where a = 1 and c = 3,最多用到索引列a;where b = 2 and c = 3,一个也用不到,必须从最左列开始

  2. 前面是范围查询,where a = 1 and b > 2 and c = 3,最多用到 a, b两个索引列;

  3. 顺序颠倒,where c = 3 and b = 2 and a = 1,一个也用不到;

  4. 索引列上使用了表达式,如where substr(a, 1, 3) = 'hhh',where a = a + 1,表达式是一大忌讳,再简单mysql也不认。有时数据量不是大到严重影响速度时,一般可以先查出来,比如先查所有有订单记录的数据,再在程序中去筛选以'cp1001'开头的订单,而不是写sql过滤它;

  5. 模糊匹配时,尽量写 where a like 'J%',字符串放在左边,这样才可能用得到a列索引,甚至可能还用不到,当然这得看数据类型,最好测试一下。

  排序对索引的影响

  order by是经常用的语句,排序也遵循最左前缀列的原则,比如key(a, b),下面语句可以用到(测试为妙)

?
1
2
3
select * from tab where a > 1 order by b
   select * from tab where a > 1 and b > '2015-12-01 00:00:00' order by b
   select * from tab order by a, b

  以下情况用不到

  1. 非最左列,select * from tab order by b;

  2. 不按索引列顺序来的,select * from tab where b > '2015-12-01 00:00:00' order by a;

  3. 多列排序,但列的顺序方向不一致,select * from tab a asc, b desc。

  聚簇索引与覆盖索引

  前面说到,mysql索引从结构上只有两类,BTREE与HASH,覆盖索引只是在查询时,要查询的列刚好与使用的索引列完全一致,mysql直接扫描索引,然后就可返回数据,大大提高效率,因为不需再去原表查询、过滤,这种形式下的索引称作覆盖索引,比如key(a,b),查询时select a,b from tab where a = 1 and b > 2,本质原因:BTREE索引存储了原表数据。

  聚簇索引也不是单独的索引,前面简要写到,BTREE索引会把数据放在索引中,即索引的叶子页中,包括主键,主键是跟表数据紧挨着放在一起的,因为表数据只有一份,一列键值要跟每一行数据都紧挨在一起,所以一张表只有一个聚簇索引,对于mysql来说,就是主键列,它是默认的。

  聚簇索引将表数据组织到了一起(参考前面主键索引简略图),插入时严重依赖主键顺序,最好是连续自增,否则面临频繁页分裂问题,移动许多数据。


### MySQL中添加索引的SQL语句MySQL中,可以通过多种方式为表添加索引。以下是一些常见的添加索引的SQL语句: #### 1. 添加主键索引(PRIMARY KEY) 主键索引用于唯一标识表中的每一行数据。可以使用以下语句为表添加主键索引: ```sql ALTER TABLE `table_name` ADD PRIMARY KEY (`column1`, `column2`); ``` 此语句将`column1`和`column2`作为联合主键[^1]。 #### 2. 添加唯一索引(UNIQUE) 唯一索引确保索引列中的所有值都是唯一的。可以使用以下语句为表添加唯一索引: ```sql ALTER TABLE `table_name` ADD UNIQUE index_name (`column1`, `column2`); ``` 此语句将为`column1`和`column2`创建一个名为`index_name`的唯一索引[^1]。 #### 3. 添加普通索引(INDEX) 普通索引是最基本的索引类型,它没有任何限制。可以使用以下语句为表添加普通索引: ```sql ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`); ``` 此语句将为`column1`和`column2`创建一个名为`index_name`的普通索引。 #### 4. 添加全文索引(FULLTEXT) 全文索引主要用于文本搜索,支持复杂的查询操作,例如模糊匹配。可以使用以下语句为表添加全文索引: ```sql ALTER TABLE `table_name` ADD FULLTEXT (`column1`, `column2`); ``` 需要注意的是,只有`CHAR`、`VARCHAR`和`TEXT`类型的列可以创建全文索引。此外,全文索引通常与`MATCH ... AGAINST`语法配合使用,而不是普通的`WHERE`语句[^2]。 #### 5. 使用`CREATE INDEX`语句添加索引 除了`ALTER TABLE`语句外,还可以使用`CREATE INDEX`语句为表添加索引: ```sql CREATE INDEX index_name ON table_name (column1, column2); ``` 此语句的效果与`ALTER TABLE ... ADD INDEX`类似,但语法略有不同。 ### 注意事项 - 在大数据量的情况下,建议先插入数据到无索引的表中,然后再创建索引,以提高性能[^2]。 - 删除索引时,可以使用以下语句: ```sql ALTER TABLE `table_name` DROP INDEX index_name; ``` 如果是主键索引,则可以直接使用: ```sql ALTER TABLE `table_name` DROP PRIMARY KEY; ``` 主键索引不需要指定索引名,因为每个表只能有一个主键[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值