暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片
MYSQL索引优化.doc
65
19页
12次
4天前
免费下载
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下
情况,假设数据库中一个表有
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
查询速度
很慢时,应该想想是否可以建索引。进入正题:
第二章、索引与优化
1
、选择索引的数据类型
MySQL
支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。通常来说,可以遵循以
下一些指导原则:
(1)
越小的数据类型通常更好:越小的数据类型通常在磁盘、内存
CPU
缓存中都需要更少的空间,处
起来更快。
(2)
简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在
MySQL
中,
应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储
IP
地址。
(3)
尽量避
NULL
:应该指定列为
NOT NULL
,除非你想存储
NULL
。在
MySQL
中,含有空值的列很难
进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用
0
、一个特殊的
或者一个空串代替空值。
1.1
、选择标识符
选择合适的标识符是非常重要的。选择时不仅应该考虑存储类型,而且应该考虑
MySQL
是怎样进行运算
和比较的。一旦选定数据类型,应该保证所有相关的表都使用相同的数据类型。
(1)
AUTO_INCREMENT
(2)
字符串:尽量避免使用字符串作为标识符,它们消耗更好的空间,处理起来也较慢。而且,通常来说
字符串都是随机的,所以它们在索引中的位置也是随机的,这会导致页面分裂、随机访问磁盘,聚簇索引
分裂(对于使用聚簇索引的存储引擎)。
2
、索引入门
对于任何
DBMS
,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,
但是,当随着数据量的增加,性能会急剧下降。
如果对多列进行索引
(
组合索引
)
,列的顺序非常重要,
MySQL
仅能对索引最左边的前缀进行有效的查找。
例如:
设存在组合索引
it1c1c2(c1,c2)
,查询语句
select * from t1 where c1=1 and c2=2
能够使用该索引。查询
select * from t1 where c1=1
能够使该索,查
select * from t1 where c2=2
不能使
该索引,因为没有组合索引的引导列,即,要想使用
c2
列进行查找,必需出现
c1
等于某值。
2.1
、索引的类型
索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每存储引擎的索引都不一定完全相同
并不是所有的存储引擎都支持所有的索引类型。
2.1.1
B-Tree
索引
假设有如下一个表:
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date not null,
gender enum('m', 'f') not null,
key(last_name, first_name, dob)
);
索引含表中每一行的
last_name
first_name
dob
列。其结构大致如下:
索引储的列中的顺列。
B-Tree
索引范围前缀
询,当,如果想使用索引,你必保证索引的最左边前缀
(leftmost prefix of the index)
来进行查询。
(1)
匹配全
(Match the full value)
:对索引中的所有列都指定具体的值。例如,上中索引可以帮助查找
1960-01-01
Cuba Allen
(2)
匹配最左前缀
(Match a leftmost prefix)
:你可以用索引查找
last name
Allen
,仅仅使用索引中的
1
列。
(3)
匹配列前缀
(Match a column prefix)
:例如,你可以用索引查找
last name
J
,这仅仅使用索
引中的第
1
列。
(4)
匹配值的范围查询
(Match a range of values)
:可以用索引查找
last name
Allen
Barrymore
之间的
仅仅使用索引中第
1
列。
(5)
匹配部精确分进范围匹配
(Match one part exactly and match a range on another part)
:可以
用索引查找
last name
Allen
,而
first name
以字
K
(6)
仅对索引进行查询
(Index-only queries)
:如果查询的列都位于索引中,则不需要读取组的值。
B-
(
)
ORDER BY
。当,使用
B-tree
索引有以下一些限制
(1)
查询必须从引的最左边的列。关于这点经提了很多。例如你不索引查找在某一
(2)
不能跳过某一索引列。例如,你不能用索引查找
last name
Smith
且出于某一
(3)
存储擎不能使索引列。例如如果的查语句
WHERE last_name="Smith"
AND first_name LIKE 'J%' AND dob='1976-12-23'
,则查询只会使用索中的列,
LIKE
查询。
of 19
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜