×

mysql索引优化 索引 怎么解决

mysql 中 创建索引很慢,怎么解决?如何解决端口被占用问题

admin admin 发表于2022-07-05 00:07:57 浏览102 评论0

抢沙发发表评论

mysql 中 创建索引很慢,怎么解决


1. 执行计划中明明有使用到索引,为什么执行还是这么慢?

2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 “ORDER BY TASK_ID DESC“ 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,“index“ 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)

优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+

在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+

由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+

在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx 》》 AND T.REL_DEVID = ’000000025xxx’

执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。

如何解决端口被占用问题


  • 1

  • 我们用eclipse或者myeclipse软件做项目时,刚开始常常会遇到这样那样的问题,弄得头都是大的,比如端口占用就是其中一个。如图

  • 步骤阅读

  • 2

    点击电脑左下角的开始程序或者按快捷键Ctrl+R进入运行界面:如图所示

    接着就可以看到运行界面窗口:如图所示

    步骤阅读

    步骤阅读

  • 3

    接着在运行界面中输入cmd命令:如图所示

    这样就能进入Dos窗口:如图所示

    步骤阅读

    步骤阅读

  • 4

    接着假如被占用的端口号是“8080“(Tomcat默认端口号),此时我们就需要在Dos界面里输入命令:netstat -aon|findstr “8080“:如图所示

    步骤阅读

  • 5

    输入完命令后我们就能看见如下效果:如图所示

    这样我们就得到了进程号“3256”!

    步骤阅读

  • 6

    得到了进程号之后接着我们再输入tasklist|findstr “3256“命令,之后就得到了进程映像名称javaw.exe:如图所示

    步骤阅读

  • 7

    在这一步就可以解决问题了!打开任务管理器方法有很多可用

    快捷键Ctrl+Alt+Delete进入之后找到javaw.exe进程将其杀死:如图所示

    步骤阅读

    END


TCP连接不上,怎么解决


你进入电驴,进入设置,点开连接,就可以看到那个TCP和UDP端口地址了,如果你以前那个端口错误,那你点一下旁边那个“随机端口”,然后试试,一般都可以,如果不行,再依照上次的方法试试,应该没得问题的。
出现你这种情况一般是你的端口无效或被杀毒软件禁用或被其他程序占用。
实在不行就重装吧,也不麻烦。
-索引