我有一个非常大的MySQL表,大约有150,000行数据。 目前,当我尝试并运行时

SELECT * FROM table WHERE id = '1';

代码运行正常,因为ID字段是主索引。 但是,对于项目的最新开发,我必须通过另一个字段搜索数据库。 例如:

SELECT * FROM table WHERE product_id = '1';

此字段先前未编入索引; 但是,我添加了一个,所以mysql现在索引该字段,但是当我尝试运行上面的查询时,它运行得非常慢。 EXPLAIN查询显示,当我已经添加了一个索引时,product_id字段没有索引,因此查询将从20分钟到30分钟的任何位置返回单行。

我的完整EXPLAIN结果是:

| 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_NAME ADD INDEX (COLUMN_NAME);

#2楼

您可以使用此语法添加索引并控制索引的类型(HASH或BTREE)。

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;

您可以在此处了解BTREE和HASH索引之间的差异: http : //dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html


#3楼

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

永远不要在MySQL中比较integerstrings 。 如果idint ,则删除引号。


#4楼

你说你有一个索引,解释说不然。 但是,如果你真的这样做,这就是如何继续:

如果列上有索引,并且MySQL决定不使用它,那可能是因为:

  1. 在MySQL认为更适合使用的查询中有另一个索引,它只能使用一个。 如果它们的常规检索方法的值超过一列,则解决方案通常是跨越多列的索引。
  2. MySQL决定有许多匹配的行,并认为tablescan可能更快。 如果不是这种情况,有时一个ANALYZE TABLE帮助。
  3. 在更复杂的查询中,它决定不在查询计划中基于非常智能的深思熟虑的巫术使用它,由于某种原因它不符合您当前的要求。

在(2)或(3)的情况下,您可以通过索引提示sytax来哄骗MySQL使用索引,但是如果这样做,请确保运行一些测试以确定它是否实际上提高了使用索引的性能,因为您提示它。


#5楼

值得注意的是,多个字段索引可以显着提高您的查询性能。 因此,在上面的示例中,我们假设ProductID是唯一要查找的字段,但是查询说ProductID = 1 AND Category = 7然后多列索引有帮助。 这是通过以下方式实现的:

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

此外,索引应与查询字段的顺序匹配。 在我的扩展示例中,索引应该是(ProductID,Category),而不是相反。


#6楼

可以添加两种类型的索引:当您定义主键时,MySQL默认将其作为索引。

说明

主键作为索引

假设您有一个tbl_student表,并且您希望student_id作为主键:

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

上面的语句添加了一个主键,这意味着索引值必须是唯一的,不能为NULL。

指定索引名称

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

上面的语句将创建一个带有student_index名称的普通索引。

创建唯一索引

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

这里, student_unique_index是分配给student_id的索引名称,并创建一个索引,其值必须是唯一的(此处可以接受null)。

全文选项

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

上面的语句将使用student_fulltext_index创建全文索引名称,您需要MyISAM Mysql Engine。

如何删除索引?

DROP INDEX `student_index` ON `tbl_student`

如何查看可用的索引?

SHOW INDEX FROM `tbl_student`

如何向MySQL表添加索引?相关推荐

  1. mysql给数据量大的表添加索引的办法

    有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...

  2. Mysql在线添加索引

    在实际工作中,经常遇到需要给数据库表添加索引的情况.虽然操作是由dba来执行,但开发还是应该了解在线添加索引会引起的性能问题.比如博主最近就遇到了线上添加索引导致业务报警的问题. 问题描述 出于业务需 ...

  3. mysql 中添加索引的三种方法

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  4. mysql 中添加索引的三种方法(一)

    在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...

  5. dax powerbi 生成表函数_Power BI应用技巧:如何为DAX建的表添加索引?

    ​ 来源于知识星球中一个星友的问题,使用DAX在PowerBI中新建了一个表,如何为这个表添加索引列呢? 假如数据模型中只有一张订单表,需要从订单表中提取客户表,可以直接使用VALUES函数提取一个不 ...

  6. 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

  7. mysql1000w数据怎么加索引_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

  8. mysql 为表添加索引

    使用ALTER TABLE语句创建索引 语法: ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名) 1.添加PR ...

  9. mysql 添加表索引语句_mysql 为表添加索引

    索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个 ...

最新文章

  1. leetcode 392
  2. 支持向量机——Large Margin Classifier
  3. 面试题,你什么时候可以入职?回答不好,容易被压薪资
  4. 嘿,来打游戏!中国电竞人才缺口达50万
  5. 为什么let在php中报错,ES6系列之声明变量let与const
  6. 37镇魔曲网页版服务器状态,37《镇魔曲网页版》官网正式上线
  7. 卷积神经网络(CNN)结尾篇:可视化跟踪(Visualize)
  8. Getting Contexts 获得上下文
  9. Type Cannot change version of project facet Dynamic Web Module to 3.0
  10. FFMPEG geq与比较函数
  11. ELK filebeat和logstash使用:配置单个文件来源、配置多个文件来源
  12. 【图像处理基础】基于matlab GUI图片浏览器【含Matlab源码 1015期】
  13. 人工智能撰稿将代替人工写作?我们拭目以待
  14. 卡巴斯基授权文件获取网站
  15. python办公自动化练习——体温
  16. iredmail邮箱使用
  17. 计算机的开机自检由什么程序完成,开机自检,教您怎么取消电脑上的开机自检...
  18. 手把手教你绘制积分动图
  19. [渝粤教育] 西南科技大学 园艺作物高产栽培 在线考试复习资料
  20. Tcar:智能车之基于mg995型号舵机的驱动控制模块

热门文章

  1. Chrome 调试 Android WebView 网页
  2. 一文看懂鸿蒙手机操作系统。和安卓、iOS 有何区别?
  3. Java队列学习第一篇之列介绍
  4. 我来告诉你【Redis】入门 一
  5. php制作会员签到打开,【PHP】织梦dedecms会员中心模板带会员签到赚金币功能
  6. Android之简单了解Android OS内部机制
  7. android sqlitelog,android-Room-SQLiteLog:(1)SQL变量过多
  8. 用存储过程实现数据分页
  9. 【Java】 剑指offer(40) 最小的k个数
  10. HDOJ 6069 素数筛