关于优化:如何向MySQL表添加索引?

How do I add indices to MySQL tables?

我有一个非常大的mysql表,大约有15万行数据。当前,当我尝试运行时

1
SELECT * FROM table WHERE id = '1';

代码运行良好,因为ID字段是主索引。然而,最近为了项目的开发,我必须通过另一个字段搜索数据库。例如

1
SELECT * FROM table WHERE product_id = '1';

这个字段以前没有被索引,但是,我已经将它添加为索引,但是当我尝试运行上面的查询时,结果非常慢。解释查询显示,当我已经添加了product_id字段时,没有该字段的索引,因此查询需要20分钟到30分钟之间的任何时间返回一行。

我的完整解释结果是:

1
2
3
4
| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows      | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL                 | NULL | NULL    | NULL |    157211 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+

请注意,我刚刚看了一眼,id字段存储为int,而product_id字段存储为varchar可能会有所帮助。这可能是问题的根源吗?


1
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)

在比较integerstrings不到MySQL。如果是的idint,去掉引号。


1
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);


你可以使用这个语法来添加和控制一种指数(或指数的哈希树)。

1
2
3
create index your_index_name on your_table_name(your_column_name) using HASH;
or
create index your_index_name on your_table_name(your_column_name) using BTREE;

你可以学习关于B树和哈希索引之间的差异……dev.mysql.com http:/ / / / /文档/恩/ index-btree-hash.html refman 5.5


这是值得注意的,你可以多场drastically索引提高查询性能。在上述的例子,我们假设操作系统的安装是一场为唯一可查询到查找说其中= 1 = 7,然后与多柱类指数的帮助。这是一个与以下国家:

1
ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

比赛应该以及如何在该指数阶的查询字段。在我的例子,应该是广义的指数(其中,在没有其他方式分类)。


两种类型的指标,可以说:当你定义了主键,索引,MySQL将把它的默认。

解释

主关键字的索引

你必须考虑你想student_idtbl_student表的主键。

1
ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

在上述声明增加主键索引值,这意味着必须是独特的、不能为空。

指定的索引

1
ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

上述语句将创建一student_index与普通索引的名称。

创建唯一索引

1
ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

在这里,student_unique_index是索引创建和分配到学生_ ID值必须是一个独特的指数(这里可以接受空值)。

全文期权

1
ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

上面的语句将创建全文索引,你需要的是与student_fulltext_index,MySQL的MyISAM引擎。

如何删除索引?

1
DROP INDEX `student_index` ON `tbl_student`

如何检查可用的索引?

1
SHOW INDEX FROM `tbl_student`

你说你有一个指数,另有解释说。然而,如果你真的继续,这就是:

如果你有一个索引在MySQL和柱,决定不使用它,因为它可以用:

  • "有一个索引,MySQL的查询和使用更多的认为合适的,它可以仅用一个。该解决方案是一个指数,通常如果他们正常的列生成方法多是由检索更多然后一列的值。
  • MySQL的决定有多去匹配的行,这是更快和tablescan认为适当者。如果这是不是一ANALYZE TABLE的情况,有时帮助。
  • 在更复杂的查询,它决定不使用它,基于智能思想甚出巫术在查询计划的一些理由,是不是适合你的当前的要求。
  • 在情况(2)或(3),你可以用同轴电缆将使用MySQL索引词索引的提示,如果你是好的,运行一些测试,确定它的实际性能指标,提高了使用的是你的提示。