mysql索引建多了有什么坏处

发布网友 发布时间:2022-04-21 05:40

我来回答

5个回答

热心网友 时间:2022-04-08 03:19

建立索引常用的规则如下:

1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响; 以上是一些普遍的建立索引时的判断依据。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大

热心网友 时间:2022-04-08 04:37

你现在种方法效率其实是差不多的,都非常低,极端低,最低

一、如果不改进效率,只简化程序,我有建议你对新闻类别进行二进制编码,仍然使用features一个字段来表示,字段为整数类型,使用最低开始的四个二进制位是否为1来表示是否为图片新闻、头条新闻、首页新闻、重要新闻,例如7(二进制的0111)表示具有头条、首页、重要三个属性。查询的时候使用位运算&来实现,图片新闻、头条新闻、首页新闻、重要新闻的权重分别是8、4、2、1,这时候假若调用三条是图片新闻的新闻时,直接可以用sql语句:
select * from news where features & 8=8 order by news_id desc limit 0,3;
假若调用三条是图片新闻、并且重要新闻时,直接可以用sql语句:
select * from news where features & 9=9 order by news_id desc limit 0,3;
看见没有,可以查询具有一种属性的,也可以查询具有多种属性的数据,程序很方便。

二、高效的办法是另外建立表来记录各类新闻,冗余保存数据到多个表中,需要查什么新闻就在哪一个表中查询。但是程序会非常复杂,保存的时候要根据类别存储到不同的表中,修改的最麻烦,如果修改类别还需要把数据从一个表移动到另外的表。当然,作为新闻这样的应用,都是保存一次、修改一二次、查看成千上万次,为了整体效率肯定是关键优化查询代码。
另外,站长团上有产品团购,便宜有保证

热心网友 时间:2022-04-08 06:11

删除数据,修改索引字段,新增操作都会对索引进行维护,维护开销大
同时需要更大的磁盘空间
需要综合平衡,取最优点

热心网友 时间:2022-04-08 08:03

如果不是用来搜寻的字段加了索引,导致插入,更新速度变慢,因为要更新索引表.

热心网友 时间:2022-04-08 10:11

在满足语句需求的情况下,尽量少的访问资源是数据库设计的重要原则,这和执行的 SQL 有直接的关系,索引问题又是 SQL 问题中出现频率最高的,常见的索引问题包括:无索引(失效)、隐式转换。1. SQL 执行流程看一个问题,在下面这个表 T 中,如果我要执行 需要执行几次树的搜索操作,会扫描多少行?

这分别是 ID 字段索引树、k 字段索引树。

这条 SQL 语句的执行流程:

1. 在 k 索引树上找到 k=3,获得 ID=3002. 回表到 ID 索引树查找 ID=300 的记录,对应 R33. 在 k 索引树找到下一个值 k=5,ID=5004. 再回到 ID 索引树找到对应 ID=500 的 R4

5. 在 k 索引树去下一个值 k=6,不符合条件,循环结束

这个过程读取了 k 索引树的三条记录,回表了两次。因为查询结果所需要的数据只在主键索引上有,所以必须得回表。所以,我们该如何通过优化索引,来避免回表呢?2. 常见索引优化2.1 覆盖索引覆盖索引,换言之就是索引要覆盖我们的查询请求,无需回表。

如果执行的语句是 ,这样的话因为 ID 的值在 k 索引树上,就不需要回表了。

覆盖索引可以减少树的搜索次数,显著提升查询性能,是常用的性能优化手段。

但是,维护索引是有代价的,所以在建立冗余索引来支持覆盖索引时要权衡利弊。

2.2 最左前缀原则

B+ 树的数据项是复合的数据结构,比如 的时候,B+ 树是按照从左到右的顺序来建立搜索树的,当 这样的数据来检索的时候,B+ 树会优先比较 name 来确定下一步的检索方向,如果 name 相同再依次比较 sex 和 age,最后得到检索的数据。

可以清楚的看到,A1 使用 tl 索引,A2 进行了全表扫描,虽然 A2 的两个条件都在 tl 索引中出现,但是没有使用到 name 列,不符合最左前缀原则,无法使用索引。所以在建立联合索引的时候,如何安排索引内的字段排序是关键。评估标准是索引的复用能力,因为支持最左前缀,所以当建立(a,b)这个联合索引之后,就不需要给 a 单独建立索引。原则上,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。上面这个例子中,如果查询条件里只有 b,就是没法利用(a,b)这个联合索引的,这时候就不得不维护另一个索引,也就是说要同时维护(a,b)、(b)两个索引。这样的话,就需要考虑空间占用了,比如,name 和 age 的联合索引,name 字段比 age 字段占用空间大,所以创建(name,age)联合索引和(age)索引占用空间是要小于(age,name)、(name)索引的。

2.3 索引下推

以人员表的联合索引(name, age)为例。如果现在有一个需求:检索出表中“名字第一个字是张,而且年龄是26岁的所有男性”。那么,SQL 语句是这么写的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com