MYSQL索引问题:索引在查询中如何使用?

MYSQL索引问题:索引在查询中如何使用?,第1张

假如你有一个表,

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_tabWHEREname LIKE '张%'

AND age = 25

这样的查询,将能够使用上面的索引。

多列索引,还有一个可用的情况就是, 某些情况下,可能查询,只访问索引就足够了, 不需要再访问表了。例如:SELECTAVG( avg ) AS 平均年龄FROMtest_tabWHEREname LIKE '张%'

这个时候, name 与 age 都包含在索引里面。 查询不需要去检索表中的数据。

索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多)。如果对之建立B-Tree索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms。这就是索引带来的效果,很多时候,当你的应用程序进行SQL查询速度很慢时,应该想想是否可以建索引。

摘自http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html


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

原文地址:https://54852.com/zaji/8566531.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存