用程序进行 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_namevarchar(50) not null,