空想--让MYSQL安装双引擎SQL优化器

坑人的innodb_thread_concurrencyMYSQL的优化器是硬解析, 应用每次发往MYSQL的SQL是文本格式,需要编译,虽然时间不多,也就几百毫秒的事情,可架不住SQL的请求并发量啊!
 

为此数据库走了两条路线, 一条是ORACLE的缓存路线, 另外一条就是MYSQL的快速路线.

ORACLE是尽可能的深度编译,找出最快的执行计划(编译后的二进制代码),然后把它缓存在内存里,下一次就避免再编译,直接从内存里拿出来执行就是了.

MYSQL 路线是浅度编译,快速出成果! 所以大家都会觉得MYSQL优化器比较弱智.对存储过程支持很鸡肋!

其实MYSQL面对互联网购买的业务,简单,比较简单.只是并发量太大了,所以简单优化器也体现其价值.

空想--让MYSQL安装双引擎SQL优化器_第1张图片

空想--让MYSQL安装双引擎SQL优化器_第2张图片

我们可以通过编程,拦截手段在语法分析完后进行拦截,

或者SQL语句与参数分离后形成DIGEST. 我们拿着个SQL的DIGEST,

也就是ORACLE的SQL_ID. 然后对比我们内存缓存的SQL.没有得话扔回MYSQL只身的优化器去优化,然后去执行.

如果有的话,我们就从内存里找到SQL执行计划,再丢给执行器去执行.

然后我们采用命令方式把SQL送给深度优化器,产生多个优化结果,返回给DBA选择.DBA选择其中一条或多条. 存入内存里.

如果数据库关闭的时候,我们把内存里的编译结果,共享池持久化到磁盘上.

这点ORACLE没有! MYSQL有把数据缓存池持久的功能.

比如说我们用 ALTER SQL PARSE SELECT * FROM TABLE WHERE A=?

或者具体值. 然后返回多个执行计划 ID ;

使用命令 ALTER SQL SAVE PRANT ID IN (323423,324235234);

就把当前的SQL深度优化器产生多个执行计划保存在内存里.

最后我们提供个内存视图 查看目前缓存了哪些SQL语句? 每个SQL语句有多少个执行计划? 每个执行计划参数范围; 每个执行计划命中次数,最后一次命中时间.
 

最后我们还要提供命令对某个内存里的SQL进行清理

ALTER SQL DELETE BY DIGEST;

ALTER SQL DELETE PRANT BY ID;

空想--让MYSQL安装双引擎SQL优化器_第3张图片

最后是以MYSQL 插件形式开发和安装XXX.SO

为什么要这样子呢? 主要解决MYSQL弱智的优化器, 添加深度优化器有利用解决MYSQL对商业SQL的支持.目前这个市场由ORACLE坐头把交椅,PG为老二!

商业SQL 比如说计算工资等复杂数量的计算. 这些计算基本是离线状态计算,并不影响MYSQL互联网高并发SQL请求. 即使上生产环境,也是上的从库.

开发出来还是有点前景 为MYSQL社区做下贡献, 成为真正的MYSQL大佬级人物,是全球性质! 比ACE 老师们 荣耀高多了!

坑人的innodb_thread_concurrency

MYSQL分区NOW()不支持

MYSQL ROOT密码忘了怎么办?

你可能感兴趣的:(mysql,mysql,sql,数据库)