让我的概念更清晰地了解Mysql
中的索引。我所知道的是索引用于使您的查询更快。除了我有几个问题需要了解。
让我们说我有疑问:
SELECT books.name, books.name2, books.id, books.image, books.faith, books.topic, books.downloaded, books.viewed, books.language, books.size, books.author as author_id, authors.name as author_name, authors.aid from books LEFT JOIN authors ON books.author = authors.aid WHERE books.id = '".$id."' AND status = 1
select
查询是否适用于JOIN
?IDS
上的索引效率是否更高?请高兴,谢谢你!
答案 0 :(得分:1)
您可以查看以下链接的详细信息。
https://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
http://mydbsolutions.in/query-optimization-2/
您的疑问在这里 -
这将取决于各种因素,例如您的表格数据是否非常少或约为。索引列中70%的数据相同,那么mysql更愿意扫描表而不是索引。简单地说,所有的连接列都应该被编入索引(如果你使用外键概念,你将被编入索引,你应该将它们编入索引)。此外,您的查询在哪个列上过滤该字段应编入索引的大多数数据。在您的情况下,您正在过滤books.id上的数据,这些数据应该是主键,因此已经编入索引。
它将自动开始使用索引,但在某些情况下可能需要更改查询。假设您使用过滤条件为"date(order_date)='2015-10-15'"
,即使在order_date上创建索引后也不会使用它,因此如果order_date列数据类型为"order_date>='2015-10-15 00:00:00' and order_date<='2015-10-15 23:59:59'"
,则必须将查询更改为datetime or timestamp
在这里,我没有看到任何制作索引的需要,因为你的条件是书籍表主键,它已经被编入索引。
如果你盲目地创建索引,那么在记录插入/更新等时,每次索引都会更新并且会减慢进程。即使重指数也会表现缓慢。还会消耗更多的磁盘空间。
如果任何列的数据超过70%相同,则无需像status or is_deleted
类型列那样创建索引,因为大部分数据都将处于活动状态。
是随机查询的索引工作,对于可以使用query cache
的可重复查询,这将更有效。
是