小编Ric*_*mes的帖子

MySQL变音符号不敏感搜索(阿拉伯语)

我无法使用阿拉伯语文本进行变音符号不敏感搜索。

我已经为相关表测试了多种设置:utf8 和 utf16 中的编码以及 utf8_general_ci、utf16_general_ci 和 utf16_unicode_ci 中的排序规则。

搜索适用于 åä 特殊字符。IE:

select * from test where text like '%a%'
Run Code Online (Sandbox Code Playgroud)

将返回文本为 a、å 或 ä 的列。但它不适用于阿拉伯语变音符号。即如果文本是?????? 我搜索???,我没有得到任何点击。

任何想法如何通过这个?

真正的用途稍后将是 PHP(一个搜索功能),但我直接在 MySQL 数据库中工作,只是为了在将其移植到 PHP 之前进行测试。

(来自评论)

CREATE TABLE test (
    ? id int(11) unsigned NOT NULL AUTO_INCREMENT,
    ? text text COLLATE utf8_unicode_ci,
    ? PRIMARY KEY (id)?
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
Run Code Online (Sandbox Code Playgroud)

mysql arabic diacritics

6
推荐指数
1
解决办法
1592
查看次数

如何使用PHP和MySQL从两个有条件链接的表中有效地SUM和SUBTRACT

对于以下查询是否有更有效的解决方案.我尽力研究这个话题,但很难知道实际搜索的内容......

$tenant_balance = 0;

$total_charge_amount_query = mysqli_query($con, "
    SELECT  tenant_charge_id, tenant_charge_total_amount
        FROM  accounts_tenant_charge
        WHERE  tenant_charge_tenancy_id='{$tenancy_details['tenancy_id']}'"
     ) or die(mysql_error());  

while($total_charge_amount_row = mysqli_fetch_array( $total_charge_amount_query )) {

    $tenant_balance = $tenant_balance +  $total_charge_amount_row['tenant_charge_total_amount'];

    $total_payment_amount_query = mysqli_query($con, "
        SELECT  tenant_charge_payment_amount
            FROM  accounts_tenant_charge_payment
            WHERE  tenant_charge_payment_tenant_charge_id =
                    '{$total_charge_amount_row['tenant_charge_id']}"
                 ) or die(mysql_error());

    while($total_payment_amount_row = mysqli_fetch_array( $total_payment_amount_query )) {

        $tenant_balance = $tenant_balance - $total_payment_amount_row['tenant_charge_payment_amount'];

    }
}

echo '£' . number_format($tenant_balance, 2, '.', ',');
Run Code Online (Sandbox Code Playgroud)

我在下面添加了数据库表结构和一些数据.

表格1

-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- …
Run Code Online (Sandbox Code Playgroud)

php mysql performance

6
推荐指数
1
解决办法
784
查看次数

如何实现更高效的搜索功能?

在我的数据库中有3列,分别是姓名,年龄,性别.在程序中,我只想使用1个搜索按钮.单击该按钮时,程序将确定文本框中的哪3个输入并搜索正确的数据.

你如何使用查询?例如,如果Name和Gender有文本,则查询:

" Select * from table Where (Name = @name) AND (Gender = @gender)"

当只输入名称时,我只查询名称.我是否必须按文本框检查文本框是否有用户输入,然后为每个文本框写入多个查询?或者有更好的方法吗?

编辑(29/5/16):我尝试这样做另一种方式

myCommand = New MySqlCommand("Select * from project_record Where
                       (FloatNo = @floatNo OR FloatNo = 'None') AND 
                       (DevCompanyName = @devCompanyName OR DevCompanyName = 'None') AND 
                       (DevType = @devType OR DevType = 'None') AND 
                       (LotPt = @lotPt OR LotPt = 'None') AND
                       (Mukim = @mukim OR Mukim = 'None') AND
                       (Daerah = @daerah OR Daerah = 'None') AND
                       (Negeri = @negeri OR Negeri = …
Run Code Online (Sandbox Code Playgroud)

mysql sql database vb.net

6
推荐指数
1
解决办法
450
查看次数

针对大型myisam表的MySQL优化

OS=centos 6.7  [Dedicated server]
memory=15G      
cpu=Intel(R) Xeon(R) CPU E5-2403
mysql= V 5.1.73    
Run Code Online (Sandbox Code Playgroud)

这是一个MyISAM表,包含大约500万行数据.在每5-6分钟插入大约3000个用户的数据(例如上传和下载速率,会话状态等).

表信息:描述"radacct"

在此输入图像描述

my.cnf中

在此输入图像描述

在此输入图像描述

从mysql慢查询日志中获取大部分时间的查询之一如下

Query_time: 7.941773  Lock_time: 0.155912 Rows_sent: 1 Rows_examined: 5377
use freeradius;
SET timestamp=1461582118;
SELECT sum(acctinputoctets) as upload,
       sum(acctoutputoctets) as     download
    FROM radacct a 
    INNER JOIN (SELECT acctuniqueid, MIN( radacctid )     radacctid 
                   FROM radacct 
                   WHERE username='batman215'
                     and acctstarttime  between '2016-02-03 12:10:47'
                                            and '2016-04-25 16:46:01' 
                   GROUP BY   acctuniqueid) b 
        ON a.acctuniqueid = b.acctuniqueid 
       AND a.radacctid =    b.radacctid;
Run Code Online (Sandbox Code Playgroud)

解释查询输出

在此输入图像描述

当有许多用户试图查看其消耗的带宽时,由于高负载和IO,服务器无法满足请求.我有什么办法可以进一步优化数据库吗?

表"radacct"的索引

在此输入图像描述

不使用\ G解释查询

在此输入图像描述

谢谢

mysql indexing myisam query-optimization freeradius

6
推荐指数
1
解决办法
1966
查看次数

在 select 子句中重用学说别名

我在 Doctrine 中有以下 SELECT 子句(查询本身是使用查询构建器创建的):

u.username,
MAX(p.score) as highscore,
SUM(pc.badgeCount) as badgeCount,
(SUM(pc.badgeCount) / :badgeSum) AS probability,
(-LOG(RAND()) * probability) as weight
Run Code Online (Sandbox Code Playgroud)

p是主实体的别名,pc是连接实体)

这给了我来自 MySQL 的错误消息:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'probability' in 'field list'
Run Code Online (Sandbox Code Playgroud)

如何在同一个 SELECT 子句中重用创建的别名?

php mysql doctrine doctrine-orm

6
推荐指数
1
解决办法
518
查看次数

在MYSQL查询中有效转换时区的最佳方法

我的表“my_logs”有大约 20,000,000 条记录,我想找出几天内每个日期有多少日志。

我想要一个结果

+------------+---------+ | date | count | +------------+---------+ | 2016-07-01 | 1623 | | 2016-07-02 | 1280 | | 2016-07-03 | 2032 | +------------+---------+

下面的这个查询只需要几毫秒就可以完成,这很好

SELECT  DATE_FORMAT(created_at, '%Y-%m-%d') as date,
        COUNT(*) as count
    FROM  my_logs
    WHERE  created_at BETWEEN '2016-07-01' AND '2016-07-04'
    GROUP BY  DATE_FORMAT(created_at, '%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

查询说明:

+------------+---------+-------+-----------------------------+ |select_type | table | type | possible_keys | +------------+---------+-------+-----------------------------+ | SIMPLE | my_logs| index | index_my_logs_on_created_at | +------------+---------+-------+-----------------------------+

+-----------------------------+---------+----------+ | key | key_len | rows | +-----------------------------+---------+----------+ | index_my_logs_on_created_at | …

mysql performance timezone dateadd convert-tz

6
推荐指数
1
解决办法
1901
查看次数

在MySQL/PHP中实现嵌套订单集

我正在尝试创建一个数据库,其中可能有n多个类别及其子类别.

首先,我尝试创建这样的邻接模型数据库

+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | Electronics          |   NULL |
|           2 | Mobile               |      1 |
|           3 | Washing Machine      |      1 |
|           4 | Samsung              |      2 |
+-------------+----------------------+--------+
Run Code Online (Sandbox Code Playgroud)

但是,我在删除节点时遇到了问题,比如如何管理已删除节点的子节点等.

然后我试图实现Joe Celko的嵌套订单集 sample_structure

每个图中的表结构:

Figure 1:
+----+-------------+-----+-----+
| id | name        | lft | rgt |
+----+-------------+-----+-----+
| 1  | Electronics | 1   | 2   |
+----+-------------+-----+-----+

Figure 2:
+----+-------------+-----+-----+
| id | name        | …
Run Code Online (Sandbox Code Playgroud)

mysql sql algorithm tree hierarchical-data

6
推荐指数
1
解决办法
228
查看次数

Larval左边加入Eloquent导致id字段被覆盖

我正在使用Laravel构建搜索列表应用程序; 该应用程序需要按距离(我已经建立)搜索企业,并包括对企业的最新订阅(如果有的话),以便我可以通过它然后距离来订购.

这里的两个模型是商业和订阅.一个企业可以拥有许多订阅(虽然只会有一个活跃的订阅).

调节器

$businesses = Business::distance($place['lat'], $place['lng'], $request->distance)
                        ->ofShopType($request->shop_type)
                        ->uptoBudget($request->price)
                        ->leftJoin('subscriptions', function($join) {
                            $join->on('businesses.id', '=', 'subscriptions.business_id')
                                 ->orderBy('subscriptions.created_at', 'desc');
                        });
return $businesses = $businesses->get();
Run Code Online (Sandbox Code Playgroud)

商业模式

public function scopeDistance($query,$from_latitude,$from_longitude,$distance)
{
    $raw = \DB::raw('ROUND ( ( 3959 * acos( cos( radians('.$from_latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$from_longitude.') ) + sin( radians('.$from_latitude.') ) * sin( radians( latitude ) ) ) ), 1 ) AS distance');
    return $query->select('*')->addSelect($raw)
             ->orderBy( 'distance', 'ASC' )
             ->groupBy('businesses.id')
             ->having('distance', '<=', $distance); …
Run Code Online (Sandbox Code Playgroud)

mysql laravel eloquent

6
推荐指数
1
解决办法
563
查看次数

在 MySQL 8 中使用点数据类型和 st_distance_sphere 查找最近的地方

我有一张桌子叫place

id | name       | coordinates (longitude, latitude)
1  | London     | -0.12574, 51.50853
2  | Manchester | -2.25, 53.41667
3  | Glasgow    | -4.25, 55.86667
Run Code Online (Sandbox Code Playgroud)

coordinates列是点数据类型。我place使用以下方法将点插入表中:

st_geomfromtext('point($longitude $latitude)', 4326)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了 SRID。

给定任何坐标,我想找到离它最近的地方(按升序排列)。我目前提出的解决方案(通过阅读 MySQL 文档)如下所示:

select
    *,
    st_distance_sphere(`place`.`coordinates`, st_geomfromtext('Point($longitude $latitude)', 4326)) as distance
from place
order by distance asc;
Run Code Online (Sandbox Code Playgroud)

在查看了此处和其他地方的无数类似问题后,很明显这是一种鲜为人知(和较新的方式)的做事方式,因此没有太多内容,因此我要寻求一些澄清。

我的问题是:

  1. 这是最好的解决方案/我这样做对吗?
  2. 这种方法会利用我在coordinates列上的空间索引吗?
  3. 使用st_distance_sphere 时,是否需要指定地球的半径才能获得准确的结果?(编辑:不,它默认使用地球的半径)

编辑,这里是这些答案:

explain select ...; 返回:

id | select_type | table | partitions | …
Run Code Online (Sandbox Code Playgroud)

mysql geospatial latitude-longitude mysql-8.0

6
推荐指数
1
解决办法
1037
查看次数

分区将如何影响我当前在 MySQL 中的查询?什么时候对我的表进行分区?

我有一个包含 150 万行、39 列的表,包含大约 2 年的销售数据,并且每天都在增长。在我们将其移动到新服务器之前我没有遇到任何问题,我们现在的内存可能更少。

目前查询需要很长时间。有人建议对导致大多数性能问题的大表进行分区,但我有几个问题。

  1. 对我描述的表进行分区是否明智,是否可能提高其性能?
  2. 如果我对它进行分区,我是否必须对当前的 INSERT 或 SELECT 语句进行更改,或者它们会继续以相同的方式工作吗?
  3. 分区执行时间是否较长?我担心由于性能缓慢,中途会发生一些事情,我会丢失数据。

  4. 我应该把它分成几年还是几个月?(我们通常会查看一个月内的数字,但有时我们会花几周或几年的时间)。我还应该对列进行分区吗?(我们有一些很少或从不使用的列,但我们稍后可能想使用它们)

mysql partitioning

6
推荐指数
2
解决办法
3910
查看次数