mysql 创建索引后怎么根据索引去查询

mysql 创建索引后怎么根据索引去查询,第1张

mysql 添加索引后 在查询的时候是mysql就自动从索引里面查询了。如果需要也可以单独根据索引查询,这个看使用场景
MYSQL在创建索引后对索引的使用方式分为两种:
1 由数据库的查询优化器自动判断是否使用索引;
2 用户可在写SQL语句时强制使用索引

看 user_indexes 的 status 字段, 如果不是 valid, 索引失效。

一、ORACLE会使索引失效的原因

1、没有 WHERE 子句。

2、使用 IS NULL 和 IS NOT NULL。

SELECT FROM emp WHERE comm IS NULL; comm 列的索引会失效。

3、WHERE 子句中使用函数。

如果没有使用基于函数的索引,那么 where 子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。例如:

select from staff where trunc(birthdate) = '01-MAY-82'

但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。

select from staff where birthdate < (to_date('01-MAY-82') + 09999)

注意:对于 MIN, MAX 函数,Oracle 仍然使用索引。

4、使用 LIKE ‘%T’ 进行模糊查询。

5、WHERE 子句中使用不等于 *** 作。

不等于 *** 作包括:<>, !=, NOT colum >= , NOT colum <=

对于这个限制条件可以通过 OR 替代,例如: colum <> 0 ===> colum>0 OR colum<0

6、等于和范围索引不会被合并使用。

SELECT emp_id, emp_m, salary_q FROM emp WHERE job='manager' AND deptno>10

job 和 deptno 都是非唯一索引,这种条件下 oracle 不会合并索引,它只会使用第一个索引。

7、 比较不匹配数据类型。

dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

select from dept where dept_id = 900198。

这是因为 oracle 会自动把 where 子句转换成 to_number(dept_id)=900198,相当于使用函数,这样就限制了索引的使用。正确写法如下:

select from dept where dept_id = '900198'

回复 3# 其实我有点晕 如果频率很大的话,那应该就是这个问题了 分三种情况: 1、 insert 添加在一定程度上可以导致B树page的分裂,从而使索引的大小变大 2 update: 如果更新索引相关的column,那么首先是删除原来那个key,然后再添加(mysql的实现,我觉得 sybase应该也差不多) 3 delete:sybase 默认在删除的时候不会清理索引页中的key的,因此在索引中会存在很多没有用的key 处理方法呢,你可以试试 rebuild index,我记得是会加sh-table的锁,这个不确定 是在不行,可以先把index drop掉,完了再创建么,反正表很小,写个脚本在半夜2点做就可以了

假如你有一个表,
SQL> CREATE TABLE test_tab (
2 id INT,
3 name VARCHAR(10),
4 age INT,
5 val VARCHAR(10)
6 );
你的业务,有一个查询,是
SELECT FROM test_tab WHERE name = 一个外部输入的数据
刚开始,数据不多的时候,执行效果还不错。
随着数据量的增加,这个查询,执行起来,越来越慢了。
然后在 name 上面 建立了索引
CREATE INDEX idx_test4_name ON test_tab (name );
这样, 可以加快前面那个查询的速度。
但是,某天,你执行了下面这个SQL, 发现速度又慢了
SELECT FROM test_tab WHERE age = 25
为啥呢? 因为 age 字段上面,没有索引
索引只在 name 上面有
换句话说, 也就是 WHERE 里面的条件, 会自动判断,有没有 可用的索引,如果有, 该不该用。
多列索引,就是一个索引,包含了2个字段。
例如:
CREATE INDEX idx_test_name_age ON test_tab (name, age);
那么
SELECT FROM test_tab
WHERE
name LIKE '张%'
AND age = 25
这样的查询,将能够使用上面的索引。
多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:
SELECT
AVG( avg ) AS 平均年龄
FROM
test_tab
WHERE
name LIKE '张%'
这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。

执行计划中有一个 access 和 filter 选项,还有可以看到 index字样的话说明就用到了,如果看不到就没有用到,如果必须要用的话可以使用强制索引。
---
以上,希望对你有所帮助。

查看索引的语法格式如下:
SHOW INDEX FROM <表名> [ FROM <数据库名>]
语法说明如下:
<表名>:指定需要查看索引的数据表名。
<数据库名>:指定需要查看索引的数据表所在的数据库,可省略。比如,SHOW INDEX FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引。
示例
使用 SHOW INDEX 语句查看《MySQL创建索引》一节中 tb_stu_info2 数据表的索引信息,SQL 语句和运行结果如下所示。
mysql> SHOW INDEX FROM tb_stu_info2\G
1 row
Table: tb_stu_info2
Non_unique: 0
Key_name: height
Seq_in_index: 1
Column_name: height
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (003 sec)
其中各主要参数说明如下:
参数 说明
Table 表示创建索引的数据表名,这里是 tb_stu_info2 数据表。
Non_unique 表示该索引是否是唯一索引。若不是唯一索引,则该列的值为 1;若是唯一索引,则该列的值为 0。
Key_name 表示索引的名称。
Seq_in_index 表示该列在索引中的位置,如果索引是单列的,则该列的值为 1;如果索引是组合索引,则该列的值为每列在索引定义中的顺序。
Column_name 表示定义索引的列字段。
Collation 表示列以何种顺序存储在索引中。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类。
Cardinality 索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL 使用该索引的机会就越大。
Sub_part 表示列中被编入索引的字符的数量。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为 NULL。
Packed 指示关键字如何被压缩。若没有被压缩,值为 NULL。
Null 用于显示索引列中是否包含 NULL。若列含有 NULL,该列的值为 YES。若没有,则该列的值为 NO。
Index_type 显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)。
Comment 显示评注。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12821425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存