索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。
在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL
);
我们随机向里面插入了10000条记录,其中有一条:5555, admin。
在查找username="admin"的记录 SELECT * FROM mytable WHERE username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
MySQL索引类型包括:
(1)普通索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
◆创建索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
◆修改表结构
ALTER mytable ADD INDEX [indexName] ON (username(length))
创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
INDEX [indexName] (username(length))
);
删除索引的语法:
DROP INDEX [indexName] ON mytable;
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
◆创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
◆修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
◆创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
UNIQUE [indexName] (username(length))
);
(3)主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID)
username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID)
PRIMARY KEY(ID)
);
当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
(4)组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
city VARCHAR(50) NOT NULL,
age INT NOT NULL
username VARCHAR(16) NOT NULL,
city VARCHAR(50) NOT NULL,
age INT NOT NULL
city VARCHAR(50) NOT NULL,
age INT NOT NULL
age INT NOT NULL
为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
SELECT * FROM mytable WHREE username="admin" AND city="郑州"
SELECT * FROM mytable WHREE username="admin"
而下面几个则不会用到:
SELECT * FROM mytable WHREE age=20 AND city="郑州"
SELECT * FROM mytable WHREE city="郑州"
(5)建立索引的时机
到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。例如:
SELECT t.Name
FROM mytable t LEFT JOIN mytable m
ON t.Name=m.username WHERE m.age=20 AND m.city='郑州'
此时就需要对city和age建立索引,由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。
刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:
SELECT * FROM mytable WHERE username like'admin%'
而下句就不会使用:
SELECT * FROM mytable WHEREt Name like'�min'
因此,在使用LIKE时应注意以上的区别。
(6)索引的不足之处
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:
◆虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
◆建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
(7)使用索引的注意事项
使用索引时,有以下一些技巧和注意事项:
◆索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
◆使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
◆索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
◆like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “�a%” 不会使用索引而like “aaa%”可以使用索引。
◆不要在列上进行运算
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用NOT IN和<>操作
以上,就对其中MySQL索引类型进行了介绍。
相关推荐
索引可以帮助快速查找和访问数据库中的数据,极大地提高了查询效率。本文将深入探讨MySQL中创建、查看和删除索引的相关知识。 一、创建索引 在MySQL中,索引主要分为以下几种类型: 1. 主键索引(Primary Key ...
例如,在插入操作中,我们可以使用绑定语句来提高效率: ```c bool CDBManager::BindInsertStmt(MYSQL *connectHandle) { // 作插入操作的绑定 MYSQL_BIND insertbind[FEILD_NUM]; if (m_stInsertParam == NULL) ...
- **覆盖索引**:如果查询只需要索引中的信息,覆盖索引可以避免回表操作,提高查询效率。 - **使用索引提示**:在某些复杂查询中,可以使用SQL的FORCE INDEX或USE INDEX提示强制MySQL使用特定的索引。 - **避免全...
例如,避免在索引列上使用函数,减少全表扫描,合理使用JOIN操作,以及避免在WHERE子句中使用OR连接条件,这些都可以显著提高查询效率。 5. **磁盘IO与预读** 磁盘IO是数据库性能的关键瓶颈,因为磁盘读取速度远...
建立组合索引可以提高查询效率,因为 MySQL 只需要扫描一次索引就可以找到所有相关的记录,而不是扫描所有记录。 5.索引的优点 索引可以带来以下几个优点: * 提高查询速度 * 降低数据库的负载 * 提高数据库的...
在MySQL中,我们可以使用`CREATE INDEX`语句来创建索引。例如,如果我们有一个名为`students`的表,包含`id`(主键)、`name`和`age`字段,我们可以在`name`字段上创建一个索引,以加快按姓名查找学生的速度。命令...
例如,在经常被用作查询条件的列上创建索引可以显著提高查询速度。 3. **索引维护**:定期检查并优化索引结构也是必要的,以确保索引始终处于高效状态。 #### 六、案例分析 以一个简单的表`people`为例,其结构...
在MySQL数据库中,索引是提高查询效率的关键工具。它们为数据表的列提供了一种排序和快速访问数据的方法,类似于书籍的目录,使我们能够迅速定位到所需的信息。MySQL支持五种主要类型的索引,分别是普通索引、主键...
在表设计视图中,你可以为每个字段定义属性,其中包括是否设置为主键、唯一约束以及创建索引。选择要建立索引的字段,然后在索引选项中设定索引类型(如主键索引、唯一索引或普通索引),并指定索引的顺序(升序或...
在MySQL中,索引是一种非常关键的数据库优化技术,它能极大地提升查询效率,尤其是在处理大量数据和复杂查询时。然而,添加索引并非随意为之,而是需要根据实际需求和性能考虑来明智地选择。 首先,理解索引的作用...
创建合适的索引可以极大提高查询效率,但过多的索引也可能增加写操作的开销,因此索引的选择与管理是数据库设计的重要环节。 B-Tree索引是最常见的索引类型,适合处理范围查询和排序操作。对于多列索引,理解索引...
这时,我们可以为`ds_order`表中的`user_id`字段创建索引,提高查询效率。 ```sql CREATE TABLE `ds_order` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 id', `user_id` int(11) NOT NULL COMMENT '...
- **使用复合索引**:通过创建包含多个列的索引,可以同时满足多个查询条件,从而减少索引的数量。 - **定期分析和优化索引**:随着数据的变化,索引的效率也会变化,定期检查和调整索引结构是必要的。 - **利用覆盖...
2. 提升查询效率:这是创建索引的主要目的,它减少了数据扫描的行数。 3. 加速表间连接:在涉及外键的联接查询中,索引可以显著提高性能。 4. 分组和排序优化:在使用GROUP BY或ORDER BY时,索引可以减少计算时间和...
- **使用索引情况**:相比之下,如果查询条件中包含的列已经创建了索引,MySQL可以直接利用索引快速定位到目标记录所在的物理位置,从而极大地提高了查询效率。 #### 二、索引的存储结构 所有MySQL索引均采用**B-...
MySQL索引是一种提高查询效率的技术,它可以帮助用户快速定位数据。索引可以分为主键索引、唯一索引、普通索引和全文索引四种类型,本文将对每种类型的索引进行详细的介绍。 一、主键索引(PRIMARY KEY) 主键索引...
3. **索引使用**:确保为查询涉及的列创建适当的索引,以提高查询速度。 4. **实际测试**:最终的选择应该基于实际的性能测试结果。通过测试不同的查询方式,找出最适合当前应用场景的SQL语句。 总之,理解不同查询...
- 使用`CREATE INDEX`语句也可以单独创建索引。 3. 主键与唯一索引: - 主键是一个特殊的唯一索引,不允许有NULL值,且每个表只能有一个主键。 - 唯一索引允许一个列中存在NULL值,但每个非NULL值必须唯一。 4....
### MySQL 索引与执行计划 #### 一、索引与执行计划 ...通过以上详细介绍,我们可以看出索引和执行计划对于提高MySQL数据库的查询性能具有重要意义。合理设计索引和利用执行计划可以显著提升数据检索的速度和效率。