MySQL优化建议少建索引(mysql 不建议建索引)
MySQL优化建议:少建索引
MySQL作为一款常用的关系型数据库管理系统,在维护大量数据时,索引起到了至关重要的作用。它可以提高查询速度,提高系统的响应速度。而MySQL中建索引的思路也很简单:以字典序为基础,对关键字进行排序,增加检索速度。然而,索引的建立也是需要慎重考虑的,如果建立了过多的索引,反而会影响数据库的性能,实际上是得不偿失的。下面就来介绍如何避免这个问题。
索引的作用
首先我们需要知道索引的作用。简单来说,索引是一种快速查找技术,通过建立索引,可以大幅提高针对某个列的查找速度,加快查询结果的反馈速度。如果没有索引,数据搜索的模式就是全表扫描,这样的效率非常低下,处理大量数据的查询任务时,就会非常慢。
为什么不建立太多的索引?
建立索引的确可以加速一些查询,但是也会对系统的性能产生影响。因此,建立索引的数量要控制在一定的范围内。下面开展具体分析。
1. 索引占据磁盘资源
索引的占用是无法忽视的,它需要磁盘空间和内存。因此,在磁盘空间和内存较小的环境下,不要建立过多的索引。当给一列建立索引时,这个列的值会存放在索引文件中,这样会让原本的数据文件变小,占用更少的磁盘空间。但是索引本身却需要额外的磁盘空间。
2. MySQL在更新时需要重新生成索引
如果要更新一张表中被索引的列,那么MySQL需要重新生成索引,这个操作是很花时间的。影响的程度根据索引的数量而异。所以,在更新及插入等频繁操作较多的表中,不要建立过多的索引。
3. 索引会影响查询的速度
虽然索引可以提高查询速度,但是如果建立过多的索引,也会影响查询速度。每个索引都需要花费时间进行搜索,而且在多表联接查询时,索引的影响更为明显。如果建立的索引过多,可能导致查询速度反而比没有索引还要慢。
优化建议
那么应该在什么情况下建立索引呢?下面提供一些优化建议。
1. 对于一些频繁使用的字段建立索引,包括主键,外键,唯一键等。
2. 对于有排序或分组需求的字段建立索引,这样可以让排序速度更快。
3. 如果查询某个字段的结果较少,可以考虑建立索引。如果这个字段的结果包含所有行的一半以上,那么这个索引的意义就不大了。
4. 对于联合索引建议只包含需要筛选的列,不要包含其他列,否则会造成性能浪费。
下面我们将通过一个案例来进一步说明这些优化建议是如何实现的。
案例演示
先看一张shop表。
CREATE TABLE `shop` (
`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '',
`description` text, `category_id` int(11) NOT NULL,
`price` decimal(10,2) NOT NULL, `created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL, PRIMARY KEY (`id`),
KEY `index_category_id` (`category_id`), KEY `index_price` (`price`),
KEY `index_created_at` (`created_at`)) ENGINE=InnoDB
我们将商品按照价格、分类、创建时间三个字段进行排序,然后查询出前10个商品的名称,描述,分类以及价格。其中分类只需要显示分类ID即可。
SELECT s.name, s.description, s.category_id, s.price
FROM shop sORDER BY s.price DESC, s.category_id, s.created_at
LIMIT 10;
执行时间为:9.491s
接下来我们为category_id和created_at建立联合索引,为price也单独建立索引。
ALTER TABLE shop
ADD INDEX `category_created` (`category_id`,`created_at`),ADD INDEX `price` (`price`);
再次执行查询语句,执行时间为:0.004s
可以看出,建立索引后查询效率大幅提升。
结论
通过以上案例可以看出,建立合理的索引可以极大地提高MySQL的查询效率。但是,要避免过多的索引对系统性能的影响。在使用索引时,需要考虑如何针对数据库中实际需求建立合理的索引,遇到不需要的索引要及时删除,这样才能更好地优化MySQL性能。