我尝试实现一个地理定位查询,该查询在具有latlng id_product和id_categories的表中搜索产品(150.000),并且查询运行速度非常慢。这是查询:
$prodottip = \App\Models\Prodotti::join('products2sellers', 'products2sellers.id_prodotto', 'prodotti.product_id')->where('prodotti.id_tipologia', 'PRODUCT')->join('aziende', 'products2sellers.id_seller', 'aziende.Id')->select('prodotti.*', 'aziende.*')->whereRaw('match (prodotti.nome, prodotti.categoria_composta, prodotti.descrizione_lunga) against (? in boolean mode)', [$cosa])->selectRaw('( 6371 * acos( cos( radians(?) ) *
cos( radians( products2sellers.lat ) )
* cos( radians( products2sellers.lng ) - radians(?)
) + sin( radians(?) ) *
sin( radians( products2sellers.lat ) ) )
) AS distance', [$lat, $lng, $lat])->OrderBy('distance', 'ASC');
任何加快速度的建议?
这是3表的转储。 我在MariaDB上,但我也安装了MongoDB。
CREATE TABLE `aziende` (
`Id` int(11) NOT NULL,
`contatto` varchar(100) NOT NULL,
`visualizzazioni` int(11) NOT NULL DEFAULT '0',
`categoriapg` varchar(130) NOT NULL DEFAULT '',
`titolo` varchar(50) NOT NULL DEFAULT '' COMMENT 'verrà utilizzato come nome aziendale',
`sottotitolo` varchar(255) NOT NULL DEFAULT '' COMMENT 'slogan aziendale',
`immagine` varchar(50) NOT NULL,
`logo` varchar(50) NOT NULL,
`IndirizzoGeolocalizzato` varchar(250) NOT NULL DEFAULT '',
`email` varchar(100) NOT NULL DEFAULT '' COMMENT 'email ufficiale',
`telefono` varchar(20) NOT NULL DEFAULT '' COMMENT 'telefono ufficiale',
`sitoweb` varchar(150) NOT NULL DEFAULT '' COMMENT 'sito web ufficiale',
`visualizza` int(1) NOT NULL DEFAULT '2',
`scadenzacontratto` datetime NOT NULL,
`ultimouser` varchar(13) NOT NULL DEFAULT '',
`ragionesociale` varchar(255) NOT NULL DEFAULT '',
`piva` varchar(30) NOT NULL DEFAULT '',
`codfisc` varchar(20) NOT NULL DEFAULT '',
`agente` int(11) NOT NULL,
`Provincia` varchar(50) NOT NULL DEFAULT '0',
`Citta` varchar(250) NOT NULL DEFAULT '0',
`attiva` int(11) NOT NULL,
`id_utente` int(11) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`entry_by` int(11) NOT NULL DEFAULT '0',
`descrizione_azienda` longtext NOT NULL,
`tag_title` varchar(100) NOT NULL,
`tag_description` varchar(100) NOT NULL,
`keywords` varchar(100) NOT NULL,
`coupon` varchar(20) NOT NULL,
`sconto` int(11) NOT NULL,
`partner` int(11) NOT NULL,
`lat` double NOT NULL,
`long` double NOT NULL,
`regione` varchar(30) NOT NULL,
`nazione` varchar(30) NOT NULL,
`via` varchar(100) NOT NULL,
`cap` varchar(10) NOT NULL,
`condizioni_vendita` longtext NOT NULL,
`condizioni_spedizione` longtext NOT NULL,
`cellulare` varchar(50) NOT NULL,
`id_piano` int(11) NOT NULL,
`citta_fatturazione` varchar(300) NOT NULL,
`via_fatturazione` varchar(300) NOT NULL,
`civico_fatturazione` varchar(20) NOT NULL,
`stato_fatturazione` varchar(30) NOT NULL,
`cap_fatturazione` int(10) NOT NULL,
`provincia_fatturazione` varchar(20) NOT NULL,
`regione_fatturazione` varchar(10) NOT NULL,
`lat_fatturazione` double NOT NULL,
`long_fatturazione` double NOT NULL,
`indirizzo_fatturazione` varchar(300) NOT NULL,
`categoria` int(11) NOT NULL,
`numero_civico_fatturazione` varchar(20) NOT NULL,
`numero_civico` varchar(12) NOT NULL,
`sla1` float NOT NULL,
`sla2` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='aziende promotrici';
-- --------------------------------------------------------
--
-- Struttura della tabella `prodotti`
--
CREATE TABLE `prodotti` (
`id` int(11) NOT NULL,
`id_tipologia` varchar(50) NOT NULL,
`categoria_principale` varchar(110) DEFAULT NULL,
`nome` varchar(50) DEFAULT NULL,
`immagini` varchar(1000) DEFAULT NULL,
`entry_by` int(11) NOT NULL,
`id_produttore` varchar(255) DEFAULT NULL,
`id_unita_misura` int(11) NOT NULL,
`prezzo` float DEFAULT NULL,
`link_statico` varchar(100) DEFAULT NULL,
`attivo` int(11) NOT NULL,
`numero_visualizzazioni` int(11) NOT NULL,
`quantita_magazzino` int(11) DEFAULT NULL,
`backorders` int(11) NOT NULL,
`codice_sku` varchar(10) DEFAULT NULL,
`pagamenti_abilitati` varchar(50) NOT NULL,
`spedizioni_abilitate` varchar(50) NOT NULL,
`tags` text NOT NULL,
`tag_title` text NOT NULL,
`tag_keywords` text NOT NULL,
`tag_description` text NOT NULL,
`id_gruppi_utenti` varchar(10) NOT NULL,
`vetrina_on` int(11) NOT NULL,
`numero_acquisti` int(11) DEFAULT '0',
`thumbnail` varchar(500) NOT NULL,
`quantita_minima` int(11) DEFAULT NULL,
`id_tasse` int(11) NOT NULL,
`descrizione_breve` longtext,
`descrizione_lunga` longtext,
`negozio` varchar(50) DEFAULT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`prezzo_scontato` float DEFAULT NULL,
`alternativi` varchar(200) NOT NULL,
`immagine_principale` varchar(100) DEFAULT NULL,
`rating` float DEFAULT NULL,
`sottocategoria` varchar(500) DEFAULT NULL,
`cod_abbonamento` int(11) NOT NULL,
`numero_acquisto` int(11) NOT NULL,
`featured` int(11) NOT NULL,
`bicolors` varchar(255) DEFAULT NULL,
`genere` varchar(250) DEFAULT NULL,
`model_id` varchar(110) DEFAULT NULL,
`barcode` int(11) DEFAULT NULL,
`prezzo_acquisto` double DEFAULT NULL,
`univoco` varchar(12) DEFAULT NULL,
`color` varchar(255) DEFAULT NULL,
`season` varchar(255) DEFAULT NULL,
`product_id` int(11) NOT NULL,
`slug` varchar(500) NOT NULL,
`showcase` int(11) NOT NULL,
`optimized` int(11) DEFAULT NULL,
`materiale` varchar(300) NOT NULL,
`peso` float NOT NULL,
`model_qty` int(11) NOT NULL,
`fornitore` varchar(100) NOT NULL,
`madein` varchar(100) NOT NULL,
`id_categoria` int(11) NOT NULL,
`categoria_composta` varchar(250) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Struttura della tabella `products2sellers`
--
CREATE TABLE `products2sellers` (
`id` int(11) NOT NULL,
`id_prodotto` int(11) NOT NULL,
`id_seller` int(11) NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`taglia` varchar(300) DEFAULT NULL,
`colore` varchar(200) DEFAULT NULL,
`model_id` varchar(50) DEFAULT NULL,
`qty` int(11) DEFAULT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indici per le tabelle scaricate
--
--
-- Indici per le tabelle `aziende`
--
ALTER TABLE `aziende`
ADD PRIMARY KEY (`Id`);
--
-- Indici per le tabelle `prodotti`
--
ALTER TABLE `prodotti`
ADD PRIMARY KEY (`id`);
--
-- Indici per le tabelle `products2sellers`
--
ALTER TABLE `products2sellers`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT per le tabelle scaricate
--
--
-- AUTO_INCREMENT per la tabella `prodotti`
--
ALTER TABLE `prodotti`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=52102;
--
-- AUTO_INCREMENT per la tabella `products2sellers`
--
ALTER TABLE `products2sellers`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=52101;COMMIT;
基本上我也可以使用预先加载来构建它,但我想结果是一样的。此外,我可以尝试在MariaDB中使用一些地理位置/插件,但我需要一些建议