我想在数据库表中添加一些mysql索引。大多数查询都是针对选择的。最好为每列创建单独的索引,还是为province
,province
和number
以及name
添加索引。索引province
是否有意义,因为只有十几个选项?
select * from employees where province = 'ab' and number = 'v45g';
select * from employees where province = 'ab';
如果用法更改为更多插入,我应该删除除number
以外的所有索引吗?
答案 0 :(得分:2)
索引是一种将列的值映射到快速可搜索树的数据结构。此树包含DB可用于快速查找行的行索引。有一点需要知道,一些数据库引擎读取加上或减去一堆行来利用磁盘读取的优势。因此,每个索引读取实际上可能会读取50或100行,而不只是一行。因此,如果您通过索引访问表的30%,您可能会多次读取所有表数据。
经验法则: - 索引更多唯一值,一个树有两个分支,两边有一半的表对于缩小搜索范围并不太有用 - 使用尽可能少的索引 - 尽可能使用真实世界的示例数字。性能可以根据数据或数据库引擎的特性动态变化,因此尝试跟踪查询的运行速度是非常重要的(即:在查询变慢的情况下记录此事件)。但是从这些数据中你可以添加索引而不会失明好的,因此有多种索引,单列和多列。当索引相互访问时,您需要多个索引,通常在使用where子句进行精炼时,需要多个列。当你想要加入时,或者你有"或"条件。当你有条件并连续过滤行时,第二个更好。
在你的情况下,名称没有意义,因为不喜欢使用索引。城市和数字确实有意义,可能是一个多列索引。省可以提供帮助以及最后一个指数。
因此,包含这些列的索引可能会有所帮助: (数,城市,省)
或者尝试一下: (号码,城市)
答案 1 :(得分:0)
您应该索引搜索到的字段并具有高选择性/基数。索引使写入速度变慢。 其他的事情是索引可以随时添加和删除,所以也许你应该让它以便稍后查看数据库和优化查询。 也就是说,您可以确定添加的一个索引位于包含人名的列中。这几乎总是用于搜索。
根据MySQL文档here:
您可以创建多个列索引,索引声明中提到的第一列在单独搜索时使用索引,而不是其他列。
文档还说,如果您创建列的哈希并保存在另一列中并对哈希列进行索引,则搜索可能比多个索引更快。
SELECT * FROM tbl_name
WHERE hash_col=MD5(CONCAT(val1,val2))
AND col1=val1 AND col2=val2;